为什么python import模块导入的时候会导入*

Zac*_*ché 3 python import python-import

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

# myfile.py
import os
import re
import pathlib

def func(x, y):
    print(x, y)
Run Code Online (Sandbox Code Playgroud)

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

from myfile import *
Run Code Online (Sandbox Code Playgroud)

它不仅导入,还func导入os、、、、repathlib

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

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

Gre*_*Guy 7

原因

因为import导入命名空间中的每个名称。如果某些内容在模块内有名称,则导出它是有效的。

如何避免

首先,您几乎不应该使用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. 如果模块包含 name __all__: List[str],则将import *仅导出该列表中包含的名称。在您的示例中,将该行添加__all__ = ['func']到您的myfile.py,然后import *将仅导入func另请参阅此答案