如果你碰巧有
from <module> import *
在程序(或模块)的中间,您将得到警告:
/tmp/foo:100: SyntaxWarning: import * only allowed at module level
我理解为什么import *
通常不鼓励这样做(命名空间不可见),但是在很多情况下,这样做很方便,尤其是在不与任何人共享代码的情况下。
那么,谁能准确地详细解释为什么from <module> import *
在所有可能的情况下都应禁止这样做?
我相信通过“在您的程序中间”,您正在谈论函数定义 内 的导入:
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源代码转换为字节码的编译器必须生成不同的代码以访问包含作用域中的变量。from module import *
并exec
使其无法编译器摸不着头脑,因为他们的名字添加到本地命名空间是在编译时不可知。因此,如果函数包含lambda
带有自由变量的函数定义或表达式,则编译器将通过引发SyntaxError
异常来对此进行标记。
这阐明了注释中讨论的Python 3.x vs 2.x行为。它总是与语言规范相反,但是CPython 2.1到2.7仅from module import *
在函数内发出错误,如果它可能会影响编译器知道变量是在本地绑定还是在包含范围内绑定的能力。在3.x中,它已升级为无条件错误。
编辑之子: …显然是flashk在几年前的另一个回答中指出了这一点,并引用了“ Python 2.1的新增功能”的同一段落。你们现在都赞成。
问题内容: 我创建了一个类“ String”,并将其放置在“ java”包中[实际上,我想创建 java.lang 以查看classLoader将哪个类加载为 一旦将一个类加载到JVM中,就不会再次加载相同的类(我再说一遍,相同的类) 引用于oreilly]。但是后来那件事,为什么在运行此类时我得到 java.lang.SecurityException:禁止的包名称: java 出于安全原因,j
问题内容: 我从节点启动这是来自node.js README.md 先决条件(仅Unix): 想知道为什么node.js需要Python?它是否在其API下使用Python 问题答案: Node.js使用GYP构建-GYP —用Python编写的跨平台构建工具。Python中还实现了其他一些构建步骤。因此,从源代码构建节点需要Python。 但是您还需要Python来构建本机插件。
问题内容: 我一直在使用pickle感到非常高兴,然后我看到了这篇文章:不要为您的数据腌制 进一步阅读似乎是: 泡菜慢 泡菜不安全 泡菜不是人类可读的 泡菜不是与语言无关的 我已将数据保存为JSON,但我想了解最佳做法: 考虑到所有这些问题,您何时会使用泡菜?需要使用哪种特定情况? 问题答案: Pickle是不安全的,因为它通过调用任意函数来构造任意Python对象。但是,这也使它可以序列化几乎所
相关代码 运行结果 site:Baidu site:Google OK site:IBM site:Taobao No break Done!
问题内容: 在大学里学习时,我不得不做一些难看的Java基础知识,例如不使用封装就可以工作,同一类中的主要方法等。(我不想在Java样式指南上展开讨论,我只是想澄清一下,我不会在大学以外写这样的东西) 我偶然发现了一种我无法向自己解释的行为: 为什么这段代码可以编译并正确运行?我怎么可能访问私有字段?由于主类位于同一类中,因此行为异常? 问题答案: 由于静态方法是类的成员,因此可以访问中的任何私有
问题内容: 我需要针对其产生太多输出到一对夫妇共享库链接到我的C 程序 ,并 使得它们既没有用我的用途。我可以访问这些库的C 源代码,但无法对其进行修改。 当与我的代码链接时,是否可以将其输出重定向到其他流或取消显示?我希望使用C ++的简洁方式,但是由于担心那是不可能的,我也会对肮脏的链接程序黑客感到满意。作为最后的手段,“代理”也可以。 我使用的是GNU工具链(工作,,Linux下)。 问题答