Python代码重构后如何让模块保留旧导入路径实现向下兼容
解决Python包重构后兼容旧导入路径的方案
问题原因
你之前直接在calcs/__init__.py中导入对象的方式,只会将newfile1注册为calcs包的属性,不会被Python识别为独立模块,因此多级路径导入import calcs.newfile1.foo会抛出模块不存在错误。
实现方案
方案1:sys.modules注册别名(推荐)
直接在calcs/__init__.py中添加如下代码,手动将实际模块挂载到对应导入路径的模块索引中:
import sys # 导入实际存储位置的模块 from .new_dir import new_file1 as newfile1 from .new_dir import new_file2 as newfile2 # 将模块注册到sys.modules的对应路径下,让Python识别为合法模块 sys.modules['calcs.newfile1'] = newfile1 sys.modules['calcs.newfile2'] = newfile2 # 可选配置:兼容通配符导入 __all__ = ['newfile1', 'newfile2']
配置完成后两种导入方式均可正常运行:
import calcs.newfile1.foofrom calcs.newfile1 import foo
方案2:创建存根模块
如果不想修改包的__init__.py逻辑,可以在calcs目录下创建和旧导入路径同名的存根文件newfile1.py,文件内容如下:
# 全部转发实际模块的内容 from .new_dir.new_file1 import * # 支持子模块扩展 __path__ = __import__('pkgutil').extend_path(__path__, __name__)
该方案需要为每个要兼容的旧模块单独创建存根文件,重构调整时维护成本更高。
内容的提问来源于stack exchange,提问作者Arran Duff
相关产品推荐
相关产品推荐

