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

如何在单个module下按命名空间与目录划分类源码文件?

解决Python命名空间与目录结构的匹配问题

我太懂这种需求了——想用目录拆分文件来方便管理代码,但又不想让最终的命名空间多出来不必要的层级,毕竟谁也不想写somepackage.foo.Foo这种啰嗦的路径对吧?

这里有个非常实用的方案,完美兼顾目录结构和命名空间的简洁性:

1. 通过__init__.py导出公开成员

在你的somepackage/__init__.py文件里,直接把各个子文件中的类/对象导入进来,相当于把它们“提升”到包的顶层命名空间:

# somepackage/__init__.py
from .foo import Foo
from .bar import Bar

# 可选:如果还有其他需要公开的函数或变量也一起导入
from .utils import some_useful_function

这样一来,用户使用你的包时,就可以直接通过包名访问这些类,完全不用关心它们实际在哪个子文件里:

# 用户的代码
from somepackage import Foo, Bar
# 或者
import somepackage
my_foo = somepackage.Foo()

2. 用下划线标记内部模块(可选但推荐)

如果不想让用户直接访问foo.py、bar.py这些内部实现文件,可以把它们的文件名改成下划线开头,比如_foo.py、_bar.py,然后在__init__.py里对应调整导入路径:

# somepackage/__init__.py
from ._foo import Foo
from ._bar import Bar

这是Python的约定俗成:下划线开头的模块、类或变量,默认被视为内部实现,不会被from somepackage import *导入,也能明确告诉其他开发者这些文件不应该直接被外部依赖。

效果对比

  • 目录结构依然保持清晰:每个类(或相关功能组)放在单独的文件里,方便你维护
  • 命名空间简洁干净:对外只暴露somepackage.Foo、somepackage.Bar,和你期望的命名空间结构完全一致

这种做法在Python的很多知名库中都有应用,既满足了代码组织的需求,又给用户提供了友好的使用体验~

内容的提问来源于stack exchange,提问作者nd1220

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:43:26