今天有趣的用例:我需要在代码更改之后迁移代码库中的模块。旧的mynamespace.Document
将消失,我希望通过将此包替换为代码对象来确保平滑的迁移,该对象将动态导入正确的路径并迁移相应的对象。在
简而言之:
# instanciate a dynamic package, but do not load
# statically submodules
mynamespace.Document = SomeObject()
assert 'submodule' not in mynamespace.Document.__dict__
# and later on, when importing it, the submodule
# is built if not already available in __dict__
from namespace.Document.submodule import klass
c = klass()
有几点需要注意:
sed
就足以更改代码以迁移一些导入,而且我不需要动态模块。我说的是物体。一个网站,包含一些实时/存储的对象将需要迁移。假设mynamespace.Document.submodule.klass
存在,这些对象将被加载,这就是动态模块的原因。我需要提供一些东西的网站加载。在from mynamespace.Document.submodule import klass
必须工作。我不能用from mynamespace import Document as container; klass = getattr(getattr(container, 'submodule'), 'klass')
我尝试了:
^{pr2}$如您所见,动态包不起作用。我不明白发生了什么,因为document
甚至没有要求ButDynamicPackageDoesNotWork
属性。在
有人能解释一下发生了什么事吗?我是否能解决这个问题?在
问题是python将绕过
sys.modules
中的fordocument
中的条目,并直接加载submodule
的文件。当然这是不存在的。在演示:
我们希望},因为python可以将其从
heap
仍然是{sys.modules
中拉出,但这不会发生。点符号本质上直接映射到{something on python path}/document/submodule.py
,并尝试直接加载它。在更新
诀窍是重写pythons导入系统。下面的代码需要您的
^{pr2}$DynamicModule
类。在相关问题 更多 >
编程相关推荐