- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如果你碰巧有
from <module> import *
在您的程序(或模块)的中间,您会收到警告:
/tmp/foo:100: SyntaxWarning: import * only allowed at module level
我明白为什么 import *
一般不鼓励(命名空间不可见),但在很多情况下它会被证明是方便的,尤其是在代码不与任何人共享。
那么,谁能详细解释一下为什么from <module> import *
应该在所有可能的情况下都被禁止?
最佳答案
我相信“在你的程序中间”你是在谈论一个导入inside一个函数定义:
def f():
from module import * # not allowed
这是不允许的,因为它会使优化函数体变得过于困难。 Python 实现在对函数进行字节编译时想要知道函数局部变量的所有名称,以便它可以将变量引用优化为(CPython)虚拟机的操作数堆栈上的操作,或者至少优化到局部变量槽操作而不是在外部命名空间中查找。如果您可以将模块的全部内容转储到函数的本地命名空间中,那么编译器将不得不假设函数中的 any 名称可能引用模块全局,因为名称列表带来in by from module import *
只在运行时知道。
将 from module import *
放在 顶级声明之间是不好的风格,但这是允许的:
def f():
...
from module import *
def g():
...
2013 年 4 月编辑: 在研究其他内容时,我发现这个限制是在 Python 2.1 中引入的,这是 "Nested Scopes" feature 的结果。 (PEP 227)。引用链接:
One side effect of the change is that the
from module import *
andexec
statements have been made illegal inside a function scope under certain conditions. The Python reference manual has said all along thatfrom module import *
is only legal at the top level of a module, but the CPython interpreter has never enforced this before. As part of the implementation of nested scopes, the compiler which turns Python source into bytecodes has to generate different code to access variables in a containing scope.from module import *
andexec
make it impossible for the compiler to figure this out, because they add names to the local namespace that are unknowable at compile time. Therefore, if a function contains function definitions orlambda
expressions with free variables, the compiler will flag this by raising aSyntaxError
exception.
这阐明了评论中讨论的 Python 3.x 与 2.x 行为。它总是与语言规范相反,但 CPython 2.1 到 2.7 只会在函数内的 from module import *
发出错误,如果它可能影响编译器知道变量是在本地绑定(bind)还是在包含范围。在 3.x 中它已被提升为无条件错误。
编辑之子: ...显然 flashk 几年前在另一个答案中指出了这一点,并引用了“Python 2.1 中的新增功能”的同一段。你们现在就去投票吧。
关于Python:为什么要禁止 'from <module> import *'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3571514/
我正在尝试使用 npmpublish 命令发布包。但我每次都会收到此错误。 npm ERR! code E403 npm ERR! 403 Forbidden - PUT https://regist
我在 WAMP 上访问我的本地主机(最后是 phpmyadmin)时遇到问题。 当我输入 localhost或 http://127.0.0.1进入我的浏览器,我收到以下消息: Forbidden Y
我正在尝试发送 $ajax,并且我已经得到了它,但是我必须使用我的表单发送文件,无论是否相同,都没关系。尚未找到 csrf token ,并且出现错误。 我的 JavaScript $(doc
我有一个奇怪的问题,我试图使用请求模块废弃某些页面,但这样做时我收到 403 访问被拒绝。但我完全能够使用 Node 的curl 模块来完成此操作。但互联网上的人们认为,它比请求模块更需要性能,因为我
所以,我正在制作一个公共(public)的不和谐机器人,但我的脚本的一部分有问题。我的 kick/ban 命令是用来完成的 $ban @user 它必须在 ping 中完成。由于这是公开的,我真的很想
我在负载均衡器后面有 2 个服务器。此 LB 上配置了 SSL。将近 50 个不同的客户端能够成功连接到我的网站,除了 1 个客户端从浏览器收到禁止 (403) 消息。 经过一番调查,我发现他在代理服
1、禁止计算局部梯度 torch.autogard.no_grad: 禁用梯度计算的上下文管理器。 当确定不会调用Tensor.backward()计算梯度时,设置禁止计算梯度会减少内存消耗。
如果 Moose 的构造函数调用中有额外的参数不是属性,有没有办法死?例如,这个: package Shoe; use Moose; has 'size' => (is => 'ro', isa =
在服务器上,安装了 Nginx。 Let's Encrypt 在 www.domain.com 上运行良好,但不适用于 static.domain.com 使用 PuTTY,当我输入时:sudo le
我使用 emacs 来编辑所有内容。在我的一些 LateX 文档中,我想在编辑表格和代码时自动禁用自动填充模式。基本上,我想要两个标签,例如: %%% BEGIN NO FILL %%%
通过 Nuget,我将 WindowsAzure.Storage 升级到 8.1.1。 然后,我下载了 AzureStorageEmulator 5.1.0.0 客户端。 我的连接字符串: UseDe
Qt documentation说,信号的返回值是不可能的: Signals are automatically generated by the moc and must not be implem
编辑版本 我有一个关于 GPG 的问题,但我写了所有的过程,也许它会对某人有所帮助。 我想:禁止 GPG 命令中的密码提示。 我不想:使用 -c 选项(--对称)。 我有 2 个系统 Linux 和
现在的想法是这样的:在 Java 中为 octalIntegerLiteral我有一个规则 octalNumeral, (integerTypeSuffix optional) 但我想得到一个数字作为
我在 Python 项目中所有模块的开头使用以下内容: import setup_loggers setup_loggers是一个可以做到这一点的模块。 import语句确保无论首先加载哪个模块,记录
我刚刚下载了最新版本的 XAMPP,PHP 版本为 7.2.4。我为 HTML 表单做了一个非常简单的 PHP 验证,当我按下提交时,它会出现以下内容: Access forbidden!You do
我已经成功运行 Vagrant 大约一个星期了。昨晚我运行了 vagrant reload,现在我无法再访问我的网站。 VirtualBox 版本 4.2.16 Vagrant 版本 1.2.7 我的
我使用以下 JavaScript 代码在完成 ajax 后播放音频: $(document).ready(function () { $.ajaxSetup(
我有一个似乎可以在互联网上运行的应用程序。但我接到了一位最终用户的电话,他在使用website时遇到困难。 我要求她发送控制台错误的屏幕截图并收到以下信息: 从 stackoverflow 搜索来看,
我在尝试提交到 svn 存储库时遇到此错误: svn: MKACTIVITY of '/svn/Demo/!svn/act/e2e65cfa-...4165f': 403 Forbidden (htt
我是一名优秀的程序员,十分优秀!