Python:为什么模块中不允许`return`

时间:2012-09-07 04:37:15

标签: python module return

如果你看一下从模块编译的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的一些过去陈述,或者更多的是随意讨论。我当然可以利用这两种优势(如已经提出的那样)和自己的劣势,但我并没有真正看到反对它的重要原因。

2 个答案:

答案 0 :(得分:6)

我猜这是python开发者的一个决定,因为它迫使模块的用户处理他们的系统不受支持的事实(而不是得到该模块的开发人员猜测应该发生什么)。想象一下,当他们在Windows机器上运行代码并且突然module.foo()无法正常工作时,他们会感到惊讶。 (你的警告print声明可能完全埋没在可能被转储到stdout的各种其他垃圾中。

我认为最常见的处理方法是提出ImportErrorNotImplementedError。然后,用户可以决定他们是否可以在没有此模块的情况下继续工作(通过捕获例外情况),或者他们的程序是否应该崩溃并在那里刻录。

答案 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()