我相信通过“在您的程序中间”,您正在谈论函数定义 内 的导入:
def f(): from module import * # not allowed
不允许这样做,因为这会使优化函数主体过于困难。Python实现希望在对函数进行字节编译时知道函数局部变量的所有名称,以便可以优化对(CPython)虚拟机操作数堆栈上的操作的变量引用,或者至少对局部变量插槽的引用。操作,而不是在外部名称空间中进行查找。如果您可以将模块的全部内容转储到函数的本地名称空间中,则编译器将必须假定函数中的
任何 名称都可能引用全局模块,因为by带来的名称列表
from module import *仅在运行时才知道。
把
from module import *两者之间 顶层声明是作风不好,但它是允许的:
def f(): ...from module import *def g(): ...
编辑2013年4月:
在研究其他内容时,我发现此限制是由于“嵌套范围”功能(PEP 227)在Python
2.1中引入的。从链接引用:
更改的一个副作用是,在某些条件下,在功能范围内将
from module import*andexec语句设为非法。Python参考手册一直说,这from module import*仅在模块的顶层是合法的,但是CPython解释器以前从未执行过此操作。作为实现嵌套作用域的一部分,将Python源代码转换为字节码的编译器必须生成不同的代码以访问包含作用域中的变量。frommodule import*并exec使其无法编译器摸不着头脑,因为他们的名字添加到本地命名空间是在编译时不可知。因此,如果函数包含lambda带有自由变量的函数定义或表达式,则编译器将通过引发SyntaxError异常来对此进行标记。
这阐明了注释中讨论的Python 3.x vs 2.x行为。它总是与语言规范相反,但是CPython 2.1到2.7仅
from module import*在函数内发出错误,如果它可能会影响编译器知道变量是在本地绑定还是在包含范围内绑定的能力。在3.x中,它已升级为无条件错误。
编辑之子: …显然是flashk在几年前的另一个回答中指出了这一点,并引用了“ Python 2.1的新增功能”的同一段落。你们现在都赞成。



