クラスを動的にロードするためのライブラリがあります。として露出しています。
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 と 1 対多であると仮定しましょう。
したがって、この定義を仮定します。
class X(Base):
y_id = Column(Integer, ForeignKey('y.id'))
y = relationship('Y')
class Y(Base):
xs = relationship('X')
これらは別々のファイルにあり、それぞれが最上位のレジストリをインポートします。
ここに問題があります-すべてのクラスを事前にロードせずに実際にこれを解決するにはどうすればよいですか?
上記の例は機能しません。レジストリを介して X のみをインポートすると、Y が sqlalchemy クラス レジストリになく、関係が壊れてしまうためです。
レジストリ自体をインポートしてクラスを直接参照すると、相互依存性のためにモジュールがロードされません。
ラムダを使用してロードを延期しようとしましたが、これも「戦略」が見つからないというエラーで失敗します。
他の人はここでどのようなアプローチを使用しましたか? 明らかな何かが欠けている場合は、お知らせください。長い一日でした。
ありがとう。