You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免文件与文件夹名称进入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:22:18