如何优雅地将预生成Foo实例纳入Python包foolib.prebuilt且不暴露源文件?
规范优雅的实现方案
1. 调整包目录结构
先把foolib包结构改成如下形式,用下划线开头的模块存放内部预构建代码,遵循Python“下划线开头为内部实现”的命名惯例:
foolib/ ├── __init__.py # 主包初始化文件,可在这里导入Foo类对外暴露 ├── foo.py # 存放Foo类的核心定义 └── prebuilt/ ├── __init__.py # 子模块对外接口入口 └── _prebuilt_instances.py # 内部文件,存放预生成的实例代码(下划线标记为内部)
2. 批量生成预构建实例到内部模块
不用生成零散的foo1.py、foo2.py,直接把所有预构建实例的代码合并写入内部模块_prebuilt_instances.py:
from foolib import Foo # 运行耗时计算生成实例 first_foo_raw = Foo(123456) second_foo_raw = Foo(345678) # 将实例代码写入内部模块 with open('foolib/prebuilt/_prebuilt_instances.py', 'w') as f: f.write(f'from foolib.foo import Foo\n') f.write(f'first_foo = Foo({repr(first_foo_raw.data_in)}, {repr(first_foo_raw.results)})\n') f.write(f'second_foo = Foo({repr(second_foo_raw.data_in)}, {repr(second_foo_raw.results)})\n')
这样所有预构建实例的代码都集中在一个内部文件里,避免文件零散混乱。
3. 在prebuilt子模块对外暴露实例
修改foolib/prebuilt/__init__.py,从内部模块导入实例并明确对外导出的名称:
# 从内部模块导入预构建实例 from ._prebuilt_instances import first_foo, second_foo # 明确对外公开的名称,用户使用`from foolib.prebuilt import *`时只会拿到这些 __all__ = ['first_foo', 'second_foo']
按照Python的社区规范,用户会默认忽略下划线开头的内部模块,自然只会通过foolib.prebuilt.first_foo这类路径访问实例。
4. 发布包时的注意事项
确保_prebuilt_instances.py被包含在发布的包文件中。如果使用setuptools,可以在setup.py中添加配置:
setup( # 其他包配置... packages=find_packages(), package_data={'foolib.prebuilt': ['_prebuilt_instances.py']} )
如果用pyproject.toml,则确保include规则覆盖该文件。
方案优势
- 完全贴合Python模块设计规范,用命名惯例引导用户使用正确路径
- 预构建实例集中管理,无零散中间文件
- 用户只能通过指定的
foolib.prebuilt路径访问实例,内部实现细节完全隐藏
内容的提问来源于stack exchange,提问作者Mathieu
相关产品推荐
相关产品推荐

