我刚刚学会了导入模块,我对通配符导入有点困惑。
from module_name import *
我完全不明白使用它的原因,我看到人们说根本不使用它。
有人可以澄清它的真正含义,为什么要使用它吗?
根据 [Python.Docs]: 模块 - 更多关于模块(重点是我的):
甚至还有一个变体可以导入模块定义的所有名称:
>>> 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)
通配符导入阴影:
- [Python.Docs]:内置函数 - open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
由:
- [Python.Docs]: os.open(path, flags, mode=0o777, *, dir_fd=None)
在处理 3个第 3 方模块时,事情可能会变得更加混乱(碰撞命中几率可能会呈指数级增长)。
from module import *
通常从给定模块导入evey name(尽管模块可能会使用__all__
来限制它)。通常最好避免使用,因为这组名称可能会随时间而更改,可能会更改代码可用的名称。
不过,为了方便起见,我有时会在交互式会话中使用它。
这用于从模块导入所有内容。建议您不要使用它的原因是,它可能会混淆您正在使用的函数或类的来源。此外,某些内容在不同的模块中可能具有相同的名称,像这样导入它们将覆盖之前导入的内容。