librería - que es pip python
Python: ¿por qué no se permite `return` en un módulo? (1)
Si observa el código de bytes de Python compilado a partir de módulos, verá al final:
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
Es decir, una return
es perfectamente válida en el nivel raíz de un módulo. Sin embargo, si intenta usarlo en el código fuente, obtendrá:
SyntaxError: ''return'' outside function
¿Por qué?
Esto es, por supuesto, una decisión de diseño de lenguaje. Pero ¿por qué fue tomada? Una return
suele ser bastante útil en un módulo. Por ejemplo, a veces quiero escribir este código al principio de un módulo:
import sys
if sys.platform != "linux2":
print "your platform is not yet supported"
# define some stubs
def foo(): pass
def bar(): pass
return
Y no quiero provocar una excepción allí (porque eso provocaría que el módulo no se cargue, lo que no deseo).
En realidad, pirateé un código que puede manipular el código de bytes de Python sobre la marcha y simplemente hacer la devolución (o, en mi caso, saltar al final donde se realiza la devolución). Esto funciona. La única razón por la que es CPython solo es porque no hay una manera estándar de manipular un objeto de código.
Here está el código.
Para posibles respuestas: preferiría evidencia real, algunas declaraciones anteriores de Guido van Rossum o algo así, no tanto una discusión aleatoria. Por supuesto, puedo ver tanto las ventajas (como ya se han presentado) y las desventajas, pero realmente no veo la gran razón en contra.
Supongo que esta es una decisión por parte de los desarrolladores de python porque obliga al usuario del módulo a lidiar con el hecho de que su sistema no es compatible (en lugar de que los desarrolladores del módulo adivinen lo que debería suceder) . Imagine su sorpresa cuando ejecutan el código en una máquina con Windows y, de repente, module.foo()
no funciona como esperaban. (Su declaración de advertencia de advertencia podría estar completamente oculta en todo tipo de basura que podría volcarse en la versión estándar).
Creo que la forma más idónea de manejar esto es elevar un ImportError
o NotImplementedError
. Luego, el usuario puede decidir si puede vivir sin este módulo y continuar, (detectando las excepciones), o si su programa debería bloquearse y quemarse allí mismo.