如何在Python timecode包中将modes子模块以Modes名称导出?
解决Python包导入Modes的报错问题
问题原因
你在__init__.py中使用from . import modes as Modes后,若使用者尝试以import timecode.Modes的方式导入会报错——因为Modes是__init__.py中定义的模块别名,并非实际子模块。而你需要的是让Modes作为包含DropFrame、NonDropFrame的命名空间供用户调用。
解决方案
修改timecode/__init__.py文件,以下两种方式任选其一:
方式一:直接将modes模块赋值为Modes并导出
这种方式保留modes模块原有结构,让Modes直接指向原模块:
# timecode/__init__.py # 导入核心类 from .timecode import Timecode from .timecoderange import TimecodeRange # 将modes模块别名为Modes from . import modes as Modes # 显式声明可导出的成员 __all__ = ["Timecode", "TimecodeRange", "Modes"]
用户可按预期使用:
from timecode import Timecode, TimecodeRange, Modes tc = Timecode("01:00:00:00", mode=Modes.NonDropFrame())
方式二:封装为类命名空间(更直观)
如果希望Modes看起来更像统一配置类,可将modes中的类封装到空类中:
# timecode/__init__.py from .timecode import Timecode from .timecoderange import TimecodeRange from .modes import DropFrame, NonDropFrame # 定义Modes类作为命名空间 class Modes: DropFrame = DropFrame NonDropFrame = NonDropFrame __all__ = ["Timecode", "TimecodeRange", "Modes"]
用户调用方式完全一致,这种方式更符合“命名空间”的直观认知,避免用户将Modes误认为模块。
验证步骤
- 确保包结构不变:
timecode/ __init__.py timecode.py timecoderange.py modes.py
- 用
pip install -e .以开发模式安装包 - 在外部环境测试导入和调用,确认无报错
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

