コードの変更をライブで反映する動的リロード オブジェクトを Python で実装しようとしています。
モジュールのリロードは機能していますが、変更を有効にするには、モジュールのクラスのすべてのインスタンスを再作成する必要があります。
問題は、プロセス中にオブジェクト データ (オブジェクト__dict__
コンテンツ) が失われることです。
だから私は別のアプローチを試しました:
def refresh(obj, memo=None):
if memo is None:
memo = {}
d = id(obj)
if d in memo:
return
memo[d] = None
try:
obj.__class__ = getattr(sys.modules[obj.__class__.__module__],
obj.__class__.__name__)
except TypeError:
return
for item in obj.__dict__.itervalues():
if isinstance(item, dict):
for k, v in item.iteritems():
refresh(k, memo)
refresh(v, memo)
elif isinstance(item, (list, tuple)):
for v in item:
refresh(v, memo)
else:
refresh(item, memo)
そして驚くべきことにそれはうまくいきます!オブジェクトで refresh() を呼び出した後、それらを再作成する必要なく、新しいコードが有効になります。
しかし、これがオブジェクトをトラバースする正しい方法であるかどうかはわかりません。オブジェクトのコンポーネントをトラバースするより良い方法はありますか?