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

Alb*_*ert 22 python module return

如果你看一下从模块编译的Python字节码,你会在最后看到:

10 LOAD_CONST               0 (None)
13 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

即,a return在模块的根级别上完全有效.但是,如果您尝试在源代码中使用它,您会得到:

SyntaxError: 'return' outside function
Run Code Online (Sandbox Code Playgroud)

为什么?


这当然是语言设计的决定.但为什么要这样做?A return在模块中通常非常有用.例如,我有时想在模块的开头编写这段代码:

import sys
if sys.platform != "linux2":
    print "your platform is not yet supported"
    # define some stubs
    def foo(): pass
    def bar(): pass
    return
Run Code Online (Sandbox Code Playgroud)

而且我不想在那里引发异常(因为这会导致模块无法加载我不想要的).


实际上,我将一些代码组合在一起,可以动态操作Python字节码并只返回(或者在我的情况下跳转到返回完成的末尾).这有效.它只是CPython的唯一原因是因为没有标准的方法来操作代码对象.

是代码.


对于可能的答案:我更喜欢真实的证据,Guido van Rossum的一些过去的陈述,或者更喜欢这个,而不是任何随机的讨论.我当然可以利用这两种优势(如已经提出的那样)和我自己的缺点,但我并没有真正看到反对它的重要原因.

mgi*_*son 6

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

我认为最常见的处理方式是提高ImportError或者提高NotImplementedError.然后,用户可以决定他们是否可以在没有此模块的情况下继续工作(通过捕获例外情况),或者他们的程序是否会崩溃并在那里烧毁.

  • @Joran Beasley我共同开发的一些[开源Python框架](https://github.com/pyinstaller/pyinstaller)将大大受益于从模块内调用`return`的能力.您个人无法设想有效的用例确实不表示不存在有效的用例. (5认同)