0

私のアプリケーションは、Python スクリプトを読み取ります。

a = MyObject("a")
b = MyObject("b")

my_objects = [a, b]

次のコードは、ファイルをロードして取得しますmy_objects(解析エラーの場合の例外は省略されています)。

_config = __import__(file_name)
if hasattr(_config, "my_objects"):
    v = getattr(_config, "my_objects")

動作しますが、ファイルの解析中に MyObject が別のオブジェクトにアクセスできるようにします。私が見つけた唯一の方法は、グローバル変数を別の python ( globs.py) ファイルで宣言して、循環インポート エラーを回避することでした。

_cached_instance

そして、私のオブジェクトのコードは次のとおりです。

import globs

class MyObject(Object):
    def __init__(self):
        self.cache_instance = globs._cached_instance

それは機能します...しかし、あまりエレガントではありません。グローバル変数を使用すると、テストが難しくなります (奇妙な境界効果が発生します)。Pythonスクリプトのロード中に_cached_instanceを「注入」し、スクリプトでのみ使用できるようにする、よりエレガントな方法を探しています。何か案は ?

4

1 に答える 1

1

私が思いついたのは初期化関数を使用することでしたが、これはもちろん解析中には実行されませんが、その直後に実行されます。

test.py

my_objects = None

def update(foo):
    globals()['my_objects'] = [foo, foo+1]

test2.py

_config = __import__("test")
_config.update(2) 
print _config.my_objects

非常に多くのアイデアが飛び交っていますが、そのほとんどは、解析中ではなく、インポート後にインポートされたモジュールをいじることに関係しています。

変数を使用可能にする 1 つの方法は、インポートを呼び出す前に呼び出し元のモジュール (test2) を変更することですが、それは__builtin__私にはかなり大きなハックのように思えます。このディスカッションで受け入れられた回答を参照してください: Python: How to make a cross-module variable?

于 2013-09-17T09:33:14.977 に答える