【发布时间】:2012-08-31 23:09:58
【问题描述】:
如果你查看从模块编译的 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 左右的一些过去的陈述,而不是任何随机讨论。我自己当然可以同时兼顾优点(如前所述)和缺点,但我并没有真正看到反对它的主要原因。
【问题讨论】:
-
你为什么不直接抛出一个异常呢?这将停止执行并返回有关为什么由调用者来监听异常的信息
-
@JoranBeasley:它不会加载模块。我说的是我仍然想加载模块的情况。
-
然后有一个单独的模块,用户可以导入......如果它不支持它不应该被支持......在
__init__.py你可以做try:import no_linux2; except:import alt_implementation as no_linux2 -
如果模块的一部分可用而另一部分不可用,那么可以说,它们应该被拆分为处理系统相关内容的子模块,并导入到主模块的命名空间中。 (例如
if sys.platform == 'linux2': import _linux_dependent as submod; ...)。这样做的好处是可以将系统相关的代码分开。 -
这不是一个原因,但这个 when 可能会帮助某人找到答案。它于 1990 年首次出现在 Python/compile.c 中,提交消息为 '"Compiling" version' hg.python.org/cpython/annotate/a6934380c6e7/Python/…