我有一个库,通过它动态加载类。它被曝光为
mylib.registry.<className>
registry 是一个类的实例,它包含一个类名(字符串)到模块名的字典,以及一个getattr调用,如果需要,它会动态加载一个类。因此,用户可以引用任何类而无需处理模块位置(有一个用于类名的全局命名空间,但没有模块名)。
例如,条目:
{'X', 'mylib.sublib.x',
'Y', 'mylib.sublib.y'}
然后可以像这样使用:
import mylib
x = mylib.registry.X()
y = mylib.registry.Y()
这就是背景。最重要的是,这些对象是相互关联的 sqlalchemy ORM 类。让我们在这里假设 X 与 Y 是一对多的。
因此假设这个定义。
class X(Base):
y_id = Column(Integer, ForeignKey('y.id'))
y = relationship('Y')
class Y(Base):
xs = relationship('X')
它们位于单独的文件中,每个文件都导入顶级注册表。
所以这就是问题所在——在不预先加载每个类的情况下,我如何才能真正解决这个问题?
上面的示例不起作用,因为如果我通过注册表仅导入 X,则 Y 不在 sqlalchemy 类注册表中,因此关系中断。
如果我导入注册表本身,然后直接引用类,那么由于相互依赖,模块不会加载。
我尝试使用 lambda 来延迟加载,但这也因缺少“策略”的错误而失败。
其他人在这里使用了什么方法?如果我遗漏了一些明显的东西,请告诉我。这是漫长的一天。
谢谢。