如果你看一下从模块编译的Python字节码,你会在最后看到:
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
即。 return
在模块的根级别完全有效。但是,如果您尝试在源代码中使用它,则会得到:
SyntaxError: 'return' outside function
为什么?
这当然是语言设计的决定。但为什么要这样做? return
在模块中通常非常有用。例如。我有时想在模块的开头写这段代码:
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的唯一原因是因为没有标准的方法来操作代码对象。
Here是代码。
对于可能的答案:我更喜欢真实的证据,Guido van Rossum的一些过去陈述,或者更多的是随意讨论。我当然可以利用这两种优势(如已经提出的那样)和自己的劣势,但我并没有真正看到反对它的重要原因。
答案 0 :(得分:6)
我猜这是python开发者的一个决定,因为它迫使模块的用户处理他们的系统不受支持的事实(而不是得到该模块的开发人员猜测应该发生什么)。想象一下,当他们在Windows机器上运行代码并且突然module.foo()
无法正常工作时,他们会感到惊讶。 (你的警告print
声明可能完全埋没在可能被转储到stdout的各种其他垃圾中。
我认为最常见的处理方法是提出ImportError
或NotImplementedError
。然后,用户可以决定他们是否可以在没有此模块的情况下继续工作(通过捕获例外情况),或者他们的程序是否应该崩溃并在那里刻录。
答案 1 :(得分:0)
这不是“为什么”(我怀疑答案仅仅是“ return
属于一个函数,没有令人信服的理由将其放入顶级模块代码”)。但这是您可能不知道的整洁解决方法。您的代码可以按以下方式进行重构,而不会增加太多复杂性:
import sys
def main():
global foo, bar
if sys.platform != "linux2":
print "your platform is not yet supported"
# define some stubs
def foo(): pass
def bar(): pass
return
main()