【问题标题】:Why does python import module imports when importing *为什么python导入模块导入时会导入*
【发布时间】:2021-01-11 18:06:26
【问题描述】:

假设我有一个要导入一些包的文件:

# myfile.py
import os
import re
import pathlib

def func(x, y):
    print(x, y)

如果我进入另一个文件并输入

from myfile import *

不仅导入func,还导入osrepathlib

但我希望在我执行import * 时导入这些模块。

为什么要导入我正在导入的其他包,您如何避免这种情况?

【问题讨论】:

  • 恭喜,您找到了不使用import * 的众多理由之一。停止使用它!
  • 这能回答你的问题吗? Can someone explain __all__ in Python?
  • Why is it importing the other packages I'm importing and how do you avoid this? 如果你的包中的所有东西(因此import *)在没有这些库的情况下也能正常工作,你为什么要导入它们?
  • 如果不需要导入,那么为什么它们会在您要导入的模块中?如果你想从你的模块中导入依赖这些的东西,为什么你不想导入那些依赖的模块?

标签: python import python-import


【解决方案1】:

原因

因为import 会导入命名空间中的每个name。如果模块内有名称,则导出有效。

如何避免

首先,您几乎不应该使用import *。导入您尝试使用的特定方法/变量 (from module import func) 或导入整个模块并通过点符号 (import module; ...; module.func()) 访问方法/变量几乎总是更清晰的代码。

也就是说,如果您必须使用import * from module,有几种方法可以防止某些名称从module 导出:

  1. import * from ... 不会导入以 _ 开头的名称。它们仍然可以直接导入(即from module import _name),但不能自动导入。这意味着您可以重命名您的导入,以便它们不会被导出,例如import os as _os。但是,这也意味着您在该模块中的整个代码必须引用_os 而不是os,因此您可能需要修改大量代码。

  2. 如果模块包含名称__all__: List[str],则import * 将仅导出该列表中包含的名称。在您的示例中,将行__all__ = ['func'] 添加到您的myfile.py,然后import * 将只导入funcSee also this answer.

【讨论】:

  • 这实际上是我想要的。如果我只是导入 myfile,我也不想导入其他东西(在这种情况下,比如 re、os 或 pathlib)
【解决方案2】:
from myfile import func

这里是修复:)

当您import * 时,您会从其中导入所有内容。其中包括您在源文件中导入的内容。

【讨论】:

    【解决方案3】:

    其实Medium上已经讨论过了,不过为了简单起见,我自己回答一下吧。

    from <module/package> import * 是一种导入我们可以在该特定模块/包中获得的所有名称的方法。通常,每个人都不会因此而真正使用import *,而是坚持使用import <module>

    【讨论】:

      【解决方案4】:

      Python 的import 本质上只是运行您指向它要导入的文件(它不完全是,但足够接近)。因此,如果您导入一个模块,它也会导入该模块导入的所有内容。如果您只想导入模块中的特定功能,请尝试:

      from myfile import func

      ...只会导入myfile.func() 而不会导入其他内容。

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 2020-11-05
        • 2015-10-06
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        相关资源
        最近更新 更多