1

これが Pythonic に聞こえないことは承知していますが、少々お待ちください。

外部のクローズド ソース モジュールに依存するモジュールを作成しています。そのモジュールを使用するにはインスタンス化する必要があります (module.create() を使用)。

私のモジュールは、ユーザーがそのモジュールを既にロードしているかどうかを調べようとしますが (簡単に実行できます)、モジュールがインスタンス化されているかどうかを調べる必要があります。各変数の type() をチェックアウトするとこれがわかることは理解していますが、メイン プログラムで定義された変数の名前を取得する方法がわかりません。この理由は、モデルをインスタンス化するときに、何らかの理由で上書きしたくない一連のパラメーターも設定されるためです。

これまでの私の試みには、sys._getframe().f_globals の使用と要素の反復処理が含まれていましたが、私のテストではうまくいきませんでした。モジュールを modInst としてインスタンス化し、モジュールで関数を呼び出すと、modInst 変数が表示されません。これに対する別の解決策はありますか?以下にサンプルコードを示します。

import sys
if moduleName not in sys.modules:
    import moduleName
    modInst = moduleName.create()
else:
    globalVars = sys._getframe().f_globals
    for key, value in globalVars:
        if value == "Module Name Instance":
            return key
    return moduleName.create()

EDIT:サンプルコードが含まれています。

4

2 に答える 2

1

あなたのコードは、関数が呼び出されたとしても、関数の直接/直接の呼び出し元によって呼び出されたと想定しているように見えます.create()(部分的にしか表示されないため、何が起こっているのかを確認するのはかなり困難です) 。結果はグローバル配置されます変数 (関数の呼び出し元が存在するモジュールの)。それはすべてかなり壊れやすいようです。そのサードパーティのモジュールには、モジュールが呼び出されたかどうかによって影響を受ける独自のグローバル変数がいくつかありませんか? 私はそれがそうであると想像します-それ以外の場合は、を実行した結果の状態変化を保持しています-そして私はそれを探求します.createcreate

あなたが提起した特定の問題に対処するには、

メインプログラムで定義された変数の名前を取得する方法がわかりません

これは簡単です。メイン プログラムはモジュールとして にあるsys.modules['__main__']ので、 を使用vars(sys.modules['__main__'])してメイン プログラムのグローバル ディクショナリを取得します (変数名は、関数、クラスなどの名前とともに、そのディクショナリのキーです)。 -- モジュールは、他のモジュールと同様に、変数用ではなく、関数用に別のものなどではなく、正確に1 つのトップレベル/グローバル名前空間を持ちます)。

于 2010-02-25T20:00:52.803 に答える
0

外部のクローズドソース モジュールが呼び出されるとしextmodます。作成my_extmod.py:

import extmod
INSTANTIATED=False
def create(*args,**kw):
    global INSTANTIATED
    INSTANTIATED=True
    return extmod.create(*args,**kw)

次に、ユーザーに直接my_extmodではなくインポートを要求します。関数が呼び出されextmodたかどうかをテストするには、 の値を確認します。createextmod.INSTANTIATED

編集: IPython セッションを開いて を入力import extmodし、次に を入力 すると、名前空間extmod.[TAB]の最上位の変数がすべて表示されます。これは、が呼び出されたextmodときに変化するパラメーターを見つけるのに役立つ場合があります。extmod.create

それがなければ、ユーザーに import をトレーニングする可能性がmy_extmodなければ、おそらく以下の関数のようなものを使用できます。find_extmod_instance内のすべてのモジュールを検索しますsys.modules

def find_instance(cls):
    for modname in sys.modules:
        module=sys.modules[modname]
        for value in vars(module).values():
            if isinstance(value,cls):
                return value

x=find_instance(extmod.ExtmodClass) or extmod.create()
于 2010-02-25T19:27:29.990 に答える