如何避免文件与文件夹名称进入Python模块的命名空间?
问题:如何让子模块/子包不暴露在父模块的命名空间中?
项目结构
├── pkg │ ├── __init__.py │ ├── folder │ │ └── func2.py │ └── func1.py
当前__init__.py内容
from .func1 import a from .folder.func2 import b
当前导入后的现象
执行导入操作后,dir(pkg)会输出包含func1和folder的结果:
>>> import pkg >>> dir(pkg) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'a', 'b', 'folder', 'func1']
解决办法
方法1:导入后删除多余的命名空间成员
直接在__init__.py末尾删除不需要的模块和包引用,就能把它们从pkg的命名空间里移除:
from .func1 import a from .folder.func2 import b # 移除不需要对外暴露的子模块和子包 del func1, folder
修改后再执行import pkg,dir(pkg)就只会显示a、b和系统默认属性,func1和folder不会再出现。
方法2:用临时别名导入再清理(更严谨的写法)
如果不想让func1和folder在__init__.py的执行过程中留下痕迹,可以用下划线前缀的临时别名导入,提取需要的对象后再清理临时引用:
# 用下划线别名导入,避免直接污染命名空间 from . import func1 as _func1 from .folder import func2 as _func2 # 提取需要对外暴露的对象 a = _func1.a b = _func2.b # 删除临时引用 del _func1, _func2
这种方式从一开始就不会让func1和folder直接出现在pkg的命名空间里,最终效果和方法1一致。
内容的提问来源于stack exchange,提问作者mrtasktat
相关产品推荐
相关产品推荐

