如何避免Python类__module__属性中的路径重复问题?
解决Python库中类导入路径重复(mylib.mylib.MyClass)的问题
为什么会出现重复路径?
MyClass.__module__属性记录的是类定义所在的原始模块路径。你的MyClass定义在mylib/mylib.py模块中,对应的模块名是mylib.mylib——即便你在mylib/__init__.py中将它导入到包级别,类本身的__module__并不会自动改变,所以打印时会显示原始的模块路径。
如何避免路径重复?
不需要把所有代码塞进__init__.py,有两种更优雅的方案:
方案1:手动修正类的__module__属性
在包的__init__.py中导入类后,直接修改它的__module__为包名:
# mylib/__init__.py from .mylib import MyClass # 修正模块路径显示 MyClass.__module__ = 'mylib'
此时再导入打印:
from mylib import MyClass print(MyClass) # <class 'mylib.MyClass'>
方案2:调整模块命名(可选)
如果不想手动修改属性,可以把存放MyClass的mylib.py重命名为更具语义的名字(比如core.py),这样原始模块路径会变成mylib.core.MyClass,配合方案1修正后,对外展示的路径依然是整洁的mylib.MyClass,同时模块结构更清晰。
PyTorch就是用类似方案1的方式:Tensor定义在torch/_tensor.py中,导入到torch/__init__.py后,会修正它的__module__属性,让对外展示的路径是torch.Tensor而非torch._tensor.Tensor。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

