2

クラスを動的にロードするためのライブラリがあります。として露出しています。

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 クラス レジストリになく、関係が壊れてしまうためです。

レジストリ自体をインポートしてクラスを直接参照すると、相互依存性のためにモジュールがロードされません。

ラムダを使用してロードを延期しようとしましたが、これも「戦略」が見つからないというエラーで失敗します。

他の人はここでどのようなアプローチを使用しましたか? 明らかな何かが欠けている場合は、お知らせください。長い一日でした。

ありがとう。

4

1 に答える 1