我刚刚学习了导入模块,我对通配符导入有点困惑。
from module_name import *
我根本不明白使用它的原因,我看到人们说根本不使用它。
有人可以澄清它的真正含义,以及为什么要使用它?
根据[Python 3.Docs]: Modules - More on Modules(重点是我的):
甚至还有一个变体来导入模块定义的所有名称:
>>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这将导入除以下划线(
_
)开头的所有名称。在大多数情况下,Python程序员不使用此工具,因为它在解释器中引入了一组未知的名称,可能隐藏了您已定义的一些内容。请注意,一般来说,从模块或包中导入
*
的做法是不受欢迎的,因为它经常会导致代码难以理解。但是,可以使用它来保存交互式会话中的输入。
因此,它意味着:将模块/包导出的所有(检查上面的__all__变量含义)符号导入当前命名空间。
通常(如上所述),当一个人在控制台中并且想要通过不“导入”导入所需的一切来节省时间时使用它。 一些不知道要导入什么的人也使用它(因此他们导入所有内容,因为他们并不真正知道他们正在做什么 - 当然也有例外,但这些很少见)。
无论如何,这可能是最雄辩的例子(因为它只依赖于Python):说明它的缺陷:
>>> with open("out.txt", "w") as f: ... f.write("DON'T USE wildcard imports!") ... 27 >>> >>> from os import * >>> >>> with open("out.txt", "w") as f: ... f.write("USING wildcard imports ...") ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: an integer is required (got type str)
通配符导入阴影:
通过:
在处理第三方模块时(碰撞机会成倍增长),事情会变得更加混乱。
这用于从模块导入所有内容。建议您不要使用它的原因是因为它可能会使您使用的函数或类的来源变得混乱。此外,某些东西在不同的模块中可能具有相同的名称,并且像这样导入它们会覆盖先前导入的模块。
from module import *
通常从给定模块导入evey名称(尽管模块可能使用__all__
来限制它)。通常最好避免使用,因为这组名称可能会随着时间的推移而改变,可能会更改代码可用的名称。
不过,我有时会在交互式会话中使用它。