为什么 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" "*"
替代方案中。
就为什么而言,这将是一个坏主意 --
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% 无关的东西。
这会使代码既不可读又不可写。
我最近尝试了这段代码,只是为了满足好奇心。
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" "*"
替代方案中。
就为什么而言,这将是一个坏主意 --
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% 无关的东西。
这会使代码既不可读又不可写。