为什么 python import module imports import *

Why does python import module imports when importing *

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

# myfile.py
import os
import re
import pathlib

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

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

from myfile import *

不仅导入了func,还导入了osrepathlib

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

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

from myfile import func

这是解决方法:)

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

原因

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

如何避免

首先,您几乎不应该使用 import *。导入您尝试使用的特定 methods/variables (from module import func) 或导入整个模块并通过点符号访问 methods/variables 几乎总是更清晰的代码 (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.

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

from <module/package> import * 是一种导入我们可以在特定 module/package 中获得的所有名称的方法。通常,出于这个原因,每个人实际上并不使用 import *,而是坚持使用 import <module>

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

from myfile import func

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