为什么 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
,还导入了os
、re
、pathlib
、
但我不希望在我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
中导出:
以 _
开头的名称将不会被 import * from ...
导入。它们仍然可以直接导入(即 from module import _name
),但不能自动导入。这意味着您可以重命名您的导入,这样它们就不会被导出,例如import os as _os
。但是,这也意味着您在该模块中的整个代码必须引用 _os
而不是 os
,因此您可能需要修改大量代码。
如果模块包含名称 __all__: List[str]
,则 import *
将仅导出该列表中包含的名称。在您的示例中,将行 __all__ = ['func']
添加到您的 myfile.py
,然后 import *
将仅导入 func
。 See also this answer.
其实在Medium上已经讨论过了,为了简单起见,我自己回答一下。
from <module/package> import *
是一种导入我们可以在特定 module/package 中获得的所有名称的方法。通常,出于这个原因,每个人实际上并不使用 import *
,而是坚持使用 import <module>
。
Python 的 import
本质上只是运行您指向它导入的文件(它不完全是,但足够接近)。因此,如果您导入一个模块,它也会导入该模块导入的所有内容。如果只想导入模块中的特定功能,请尝试:
from myfile import func
...这只会导入 myfile.func()
而不是其他内容。
假设我有一个要导入一些包的文件:
# myfile.py
import os
import re
import pathlib
def func(x, y):
print(x, y)
如果我进入另一个文件并输入
from myfile import *
不仅导入了func
,还导入了os
、re
、pathlib
、
但我不希望在我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
中导出:
以
_
开头的名称将不会被import * from ...
导入。它们仍然可以直接导入(即from module import _name
),但不能自动导入。这意味着您可以重命名您的导入,这样它们就不会被导出,例如import os as _os
。但是,这也意味着您在该模块中的整个代码必须引用_os
而不是os
,因此您可能需要修改大量代码。如果模块包含名称
__all__: List[str]
,则import *
将仅导出该列表中包含的名称。在您的示例中,将行__all__ = ['func']
添加到您的myfile.py
,然后import *
将仅导入func
。 See also this answer.
其实在Medium上已经讨论过了,为了简单起见,我自己回答一下。
from <module/package> import *
是一种导入我们可以在特定 module/package 中获得的所有名称的方法。通常,出于这个原因,每个人实际上并不使用 import *
,而是坚持使用 import <module>
。
Python 的 import
本质上只是运行您指向它导入的文件(它不完全是,但足够接近)。因此,如果您导入一个模块,它也会导入该模块导入的所有内容。如果只想导入模块中的特定功能,请尝试:
from myfile import func
...这只会导入 myfile.func()
而不是其他内容。