25

如果您查看从模块编译的 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 过去的一些陈述,而不是任何随机讨论。我自己当然可以同时兼顾优点(如前所述)和缺点,但我并没有真正看到反对它的主要原因。

4

2 回答 2

7

我猜这是python开发人员的决定,因为它迫使模块的用户处理他们的系统不受支持的事实(而不是让模块的开发人员猜测应该发生什么) . 想象一下,当他们在 Windows 机器上运行代码并且突然module.foo()无法按预期工作时,他们会感到惊讶。(您的警告print声明可能完全隐藏在可能被倾倒到标准输出的各种其他垃圾中)。

我认为处理这个问题的最惯用的方法是提出ImportErroror NotImplementedError。然后用户可以决定他们是否可以在没有这个模块的情况下继续工作(通过捕获异常),或者他们的程序是否应该在那里崩溃和烧毁。

于 2012-09-07T04:43:33.647 回答
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()
于 2019-08-15T07:03:15.153 回答