1

コードの変更をライブで反映する動的リロード オブジェクトを 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() を呼び出した後、それらを再作成する必要なく、新しいコードが有効になります。

しかし、これがオブジェクトをトラバースする正しい方法であるかどうかはわかりません。オブジェクトのコンポーネントをトラバースするより良い方法はありますか?

4

1 に答える 1

1

Pythonクックブックでこのレシピを参照してください(または、「印刷された」バージョンのより良いバージョンで、Googleブック検索で実際に無料で読むことができると思います。または、無料の1を使用してO'Reillyの「Safari」サイトで確実に読むことができます。 - 1 週間のトライアル サブスクリプション -- 「印刷された本」バージョンを入手するために、ハドソンのオリジナル レシピを大幅に編集しました!)。

于 2009-07-17T02:24:12.533 に答える