No se puede llamar al objeto Python NoneType (principiante)


Me dice la línea 1 y la línea 5 (nuevo en depuración/programación, no estoy seguro de si eso ayuda)

def hi():     
    print 'hi'

def loop(f, n):         #f repeats n times
    if n<=0:
        return
    else:
        f()             
        loop(f, n-1)    

loop(hi(), 5)
hi
TypeError: 'NoneType' object is not callable

¿Por qué me da ese error?

Author: Tim Pietzcker, 2012-03-19

3 answers

Desea pasar el objeto function hi para su función loop(), no el resultado de una llamada a hi() (que es None ya que hi() no devuelve nada).

Así que prueba esto:

>>> loop(hi, 5)
hi
hi
hi
hi
hi

Quizás esto te ayude a entender mejor: {[12]]}

>>> print hi()
hi
None
>>> print hi
<function hi at 0x0000000002422648>
 43
Author: Tim Pietzcker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-19 10:56:23

¿Por qué me da ese error?

Debido a que su primer parámetro que pasa a la función loop es None pero su función está esperando un objeto llamable, que None object no lo es.

Por lo tanto, debe pasar el objeto callable que es en su caso el objeto de función hi.

def hi():     
  print 'hi'

def loop(f, n):         #f repeats n times
  if n<=0:
    return
  else:
    f()             
    loop(f, n-1)    

loop(hi, 5)
 2
Author: Nicoretti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-19 11:10:08

No debe pasar la función de llamada hi() a la función loop (), esto dará el resultado.

def hi():     
  print('hi')

def loop(f, n):         #f repeats n times
  if n<=0:
    return
  else:
    f()             
    loop(f, n-1)    

loop(hi, 5)            # Do not use hi() function inside loop() function
 2
Author: M.J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-09 04:55:43