为什么 import * 在 Python 3 中不是有效语法?

Why is import * not valid syntax in Python 3?

我最近尝试了这段代码,只是为了满足好奇心。

from * import * as *

if __name__ == '__main__':
    z = *.zeros((3,3))
    print(z)

有人可以告诉我为什么 import * 不被视为有效选项吗? 我真的想要一个选项,只在一行中导入每个库 installed/recognized。 我应该 post 错误报告还是功能请求?

根据为什么 import *from * import *和其他变体在Python中不被认为是有效语法,可以快速查看 Python 的语法即可理解。 import statement 的语法是

import_stmt     ::=  "import" module ["as" identifier] ("," module ["as" identifier])*
                     | "from" relative_module "import" identifier ["as" identifier] ("," identifier ["as" identifier])*
                     | "from" relative_module "import" "(" identifier ["as" identifier] ("," identifier ["as" identifier])* [","] ")"
                     | "from" relative_module "import" "*"
module          ::=  (identifier ".")* identifier
relative_module ::=  "."* module | "."+

您会注意到每个标记(除了文字文本标记)都归结为 identifier 个标记的某种组合。 grammar of identifiers 有点复杂,但快速浏览一下规则应该清楚字符 * (U+002A) 不是有效标识符。这排除了像 import * 这样的结构,因为语法要求在 * 出现的位置有一个有效的标识符。在 import 语句中允许 * 的唯一情况是它被明确允许作为文字文本标记。这只发生在 "from" relative_module "import" "*" 替代方案中。

为什么而言,这将是一个坏主意 --

来自Zen of Python

In the face of ambiguity, refuse the temptation to guess.

这是 Python 避免歧义的设计原理的一部分,并迫使开发人员明确选择他们想要的东西。

当您使用 from * import * 时,您将导入每个模块中定义的每个名称。这意味着你是 两者 运行...

from lxml.etree.ElementTree import *

from xml.etree.ElementTree import *

...所以,你怎么知道你的命名空间中的函数 fromstring() 是来自 lxml.etree,还是来自 xml.etree,或者不是来自其他库?首先与 XML 完全不相关?

同样,这意味着您突然有了一个 loads 函数,但您不知道它是 json.loads() 还是 yaml.loads(),还是 100% 无关的东西。

这会使代码既不可读又不可写。