【问题标题】:What is the reason for using a wildcard import?使用通配符导入的原因是什么?
【发布时间】:2019-09-07 09:18:54
【问题描述】:

刚学了导入模块,对通配符导入有点迷茫。

from module_name import *

我完全不明白使用它的原因,我看到人们说根本不使用它。

有人可以澄清它的真正含义吗?为什么要使用它?

【问题讨论】:

  • 这意味着您导入模块的所有内容,并且您可以使用小模块,但在真正的大模块中,您将获得大量加载时间并且您的程序会变得非常慢
  • 如果您要使用从模块中导出的所有内容,那么单独导入每个内容是多余的,不是吗?您的另一个选择是仅导入module,然后在任何地方使用module.thing。两种解决方案都不会产生好看的代码
  • 假设你有一个包含 100 个函数的模块 util.py。现在您要使用其中的 50 个,您可能希望使用 from util import * 而不是一个一个地导入它们。
  • 通配符导入不好的一个例子:做import os 并想知道为什么open 突然不像open 那样工作了。
  • @reportgunner:那是OutOfCoffeeError。你是对的。

标签: python python-3.x python-import python-module


【解决方案1】:

根据[Python.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(查看上面的页面了解__all__变量的含义)symbols由模块/包导出到当前命名空间

通常(如上所述),当一个人在控制台中并且想要通过不“手动”导入所有需要的东西来节省时间时使用它。
某些不知道要导入什么的人也使用它(因此他们导入所有内容,因为他们并不真正知道自己在做什么 - 当然也有例外,但很少见)。

无论如何,可能这是最有说服力的例子(因为它依赖于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)

通配符导入阴影:

作者:

在处理 3rd 方模块时,事情会变得更加混乱(碰撞命中的几率会成倍增长)。

【讨论】:

  • @Jperkins98:这回答了你的问题吗?
【解决方案2】:

from module import * 通常从给定模块导入每个名称(尽管模块可能使用__all__ 来限制它)。通常最好避免这种情况,因为这组名称可能会随着时间而改变,可能会改变代码可用的名称。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    最近更新 更多