2011-11-02 15 views
8

Esta pregunta tiene más que ver con la curiosidad que con la utilidad. Si estoy escribiendo una función que se supone que se ejecutará para siempre, por ejemplo un daemon, ¿cómo manejaría Python si volviera a llamar a la función desde el final de la función?¿Es pecado utilizar recursión infinita para bucles infinitos en Python?

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

Estoy bastante seguro de que haciendo esto en C daría lugar a un desbordamiento de pila, pero teniendo en cuenta el nivel de abstracción de C a Python supongo cosas se maneja de manera diferente.

¿Me iría al infierno por esto?

+0

La gente se va al infierno por los bucles de demonios, no por demonios ;-) En Python, obtendrá una excepción, "RuntimeError: la profundidad de recursión máxima excedida". –

Respuesta

1

La versión C del intérprete de Python (que es probablemente lo que está utilizando) provocará un error eventualmente si nunca regresa de daemonLoop. No estoy seguro acerca de otras versiones.

+0

¿Por qué el intérprete generaría un error si nunca vuelve? Esto no está claro o está mal. – agf

5

El nivel de recursividad puede ser recuperada con sys.getrecursionlimit() y establece con sys.setrecursionlimit().

Would I go to hell for this?

Sí. CPython no tiene eliminación de recurrencia de cola/optimización de última llamada.

def recurse(): 
    recurse() 

recurse() 

error:

 
    # 1000 or so lines of this: 
    File "", line 2, in recurse 
RuntimeError: maximum recursion depth exceeded 
1

No sé por qué se podría pensar en hacer algo así cuando simplemente podría tener un bucle infinito while. De todos modos para la pregunta sobre si funcionará:

... 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
RuntimeError: maximum recursion depth exceeded 

Así que sí, el infierno lo es.

0
(define forever (lambda() (forever))) 

¡Este tipo de recursión es para lo que se hacen los dialectos de Lisp como Scheme!

+0

Sí, pero esa no era la pregunta. – delnan

Cuestiones relacionadas