Python包__init__.py通配导入暴露依赖成员问题咨询
解决Python包
__init__.py导入时意外暴露依赖成员的问题 我完全懂你的困扰——本来想通过__init__.py里的from .module1 import *、from .module2 import *把自定义的类和函数对外暴露,结果连模块里导入的math.sqrt这类依赖成员也被一并导出了,这显然不是你想要的效果。
问题的根源在于:import *会导入目标模块中所有不以下划线开头的名称,不管这个名称是你自己定义的,还是从其他模块导入进来的。
下面给你几个实用的解决方案:
1. 显式指定要导出的成员(最推荐)
放弃使用import *,而是在__init__.py里明确列出你想对外暴露的类和函数:
# pack1/__init__.py from .module1 import MyCustomClass, my_utility_function from .module2 import AnotherClass, calculate_value
这种方式最清晰,完全不会意外导入无关依赖,使用者也能一眼看到包对外提供的接口。
2. 在子模块中定义__all__变量
如果还是想保留import *的写法,可以在每个子模块(比如module1.py、module2.py)里定义__all__,明确标记允许被import *导出的成员:
# pack1/module1.py import math # 自定义类和函数 class MyCustomClass: pass def my_utility_function(): pass # 只允许导出自己定义的成员 __all__ = ['MyCustomClass', 'my_utility_function']
这样当你在__init__.py里写from .module1 import *时,就只会导入__all__列表里的内容,math.sqrt这类依赖成员不会被暴露出去。
3. 导入子模块本身而非成员
如果你希望使用者通过pack1.module1.MyCustomClass的方式访问,也可以在__init__.py里直接导入子模块:
# pack1/__init__.py from . import module1 from . import module2
这种方式虽然不会直接把成员暴露在包的根层级,但能避免意外导出依赖,同时保持模块结构清晰。
内容的提问来源于stack exchange,提问作者Lester Jack
相关产品推荐
相关产品推荐

