使用通配符导入的原因是什么?



我刚刚学会了导入模块,我对通配符导入有点困惑。

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__来限制它)。通常最好避免使用,因为这组名称可能会随时间而更改,可能会更改代码可用的名称。

不过,为了方便起见,我有时会在交互式会话中使用它。

这用于从模块导入所有内容。建议您不要使用它的原因是,它可能会混淆您正在使用的函数或类的来源。此外,某些内容在不同的模块中可能具有相同的名称,像这样导入它们将覆盖之前导入的内容。

最新更新