2012-02-27 9 views
7

Me pregunto si alguien puede encontrar una forma de comprobar si una función necesita devolver un valor significativo en Python. Es decir, para verificar si el valor de retorno se usará para cualquier cosa. Supongo que la respuesta es no, y es mejor reestructurar el flujo de mi programa. La función en cuestión extrae sus valores de retorno de un socket de red. Si el valor de retorno no se va a utilizar, no quiero desperdiciar los recursos que se obtienen del resultado.Comprueba si hay algo "esperando" el valor de retorno de una función

He intentado ya utilizar los trazados para descubrir la línea de llamada, pero eso no funcionó. Aquí está un ejemplo de lo que tenía en mente:

>>> def func(): 
... print should_return() 
... 
>>> func() 
False 
>>> ret = func() 
True 

La función "sabe" que se le ha asignado su valor de retorno.

Aquí está mi solución actual:

>>> def func(**kwargs): 
... should_return = kwargs.pop('_wait', False) 
... print should_return 
... 
>>> func() 
False 
>>> ret = func(_wait=True) 
True 
+4

Todas las funciones en Python siempre regresan. Si no devuelve explícitamente, las funciones devuelven 'None'. – birryree

+2

Las funciones de Python no, de hecho, siempre regresan. Si regresan, sin embargo, siempre devuelven un valor, que a menos que se especifique, es Ninguno. – Arafangion

+0

Entiendo eso, pero la mayoría de las veces una función que devuelve 'None' es equivalente a no devolver nada. En este caso, necesito verificar si debe devolver algo que no sea 'None'. – Violet

Respuesta

3

La misma segunda línea del cuerpo de import this lo dice todo: "explícito es mejor que implícito". En este caso, si proporciona un argumento opcional, el código será más obvio (y, por lo tanto, más fácil de entender), más simple, más rápido y más seguro. Guárdelo como un argumento separado con un nombre como wait.

Aunque con dificultad podría implementarlo mágicamente, sería un código desagradable, propenso a romper en las nuevas versiones de Python y no es obvio. Evita esa ruta; allí está el camino a la locura.

4

Todas las funciones devuelven un valor cuando se completa.

Si estás preguntando si deben volver en absoluto, entonces en realidad se está preguntando por The Halting Problem

+0

Entiendo que cualquier función devolverá un valor, me pregunto más si es posible determinar si una función debe devolver un valor _meaningful_. – Violet

+0

¿Qué quiere decir con "significativo"? Esto, sigue siendo el mismo problema de detención. – Arafangion

0

Todas las funciones en Python siempre regresan. Si no devuelve explícitamente, las funciones devuelven None.

===========

func def(): while True: pase

Esta función no vuelve.

No hay forma de determinar si volverá una función arbitraria. Si puedes, has resuelto el problema de Turing.

0

Considerar la posibilidad de devolver un futuro, o 'promesa'. Es decir, devuelve otra función que, cuando se ejecuta, realiza el trabajo necesario para determinar realmente el resultado. Parece que estoy pensando que quiere una evaluación perezosa, que es "evaluar solo lo que necesita" (más o menos), en lugar de su pregunta, lo que confusamente pregunta: "Evaluar solo si devuelve un valor, que podría ser necesario".

Cuestiones relacionadas