Entonces recibo el error

[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

El código que estoy ejecutando es

import threading

def hello_world(a):
    threading.Timer(2.0, hello_world(a)).start() # called every minute
    print(a)
    print("Hello, World!")

hello_world('a')

Noté que cuando no hay argumentos en la función hello_world el error no ocurre. Pero tan pronto como necesito pasar un parámetro a la función, obtengo el error. ¿Alguien puede explicar por qué ese es el caso y cómo solucionarlo?

3
Mark Shaio 26 oct. 2019 a las 08:38

1 respuesta

La mejor respuesta

El constructor threading.Timer() espera la función y los argumentos para pasar a esa función como parámetros separados. La forma correcta de llamarlo es esta:

threading.Timer(2.0, hello_world, (a,)).start()

Puede ver que nos referimos a hello_world sin llamarlo, y enumeramos los parámetros que queremos pasar por separado en una 1 tupla (a,).

De la forma en que lo está haciendo actualmente , está evaluando hello_world(a) inmediatamente, antes de llegar al final de la expresión, tratando de averiguar cuál sería el valor de retorno de hello_world(a) be - en lugar de iniciar el temporizador y luego evaluar la expresión cada vez que el temporizador se apaga.

5
Green Cloak Guy 26 oct. 2019 a las 05:41