如果您查看从模块编译的 Python 字节码,您将在最后看到:
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
即 areturn
在模块的根级别完全有效。但是,如果您尝试在源代码中使用它,您会得到:
SyntaxError: 'return' outside function
为什么?
这当然是一个语言设计决定。但为什么被拿走了?Areturn
在模块中通常非常有用。例如,我有时想在模块的开头编写这段代码:
import sys
if sys.platform != "linux2":
print "your platform is not yet supported"
# define some stubs
def foo(): pass
def bar(): pass
return
而且我不想在那里引发异常(因为这会导致模块不加载我不想要的)。
实际上,我一起编写了一些代码,这些代码可以即时操作 Python 字节码并执行返回(或者在我的情况下跳转到完成返回的末尾)。这行得通。它只是 CPython 的唯一原因是没有标准的方法来操作代码对象。
这是代码。
对于可能的答案:我更喜欢真实的证据,Guido van Rossum 过去的一些陈述,而不是任何随机讨论。我自己当然可以同时兼顾优点(如前所述)和缺点,但我并没有真正看到反对它的主要原因。