2

Python でテスト エンジンを開発していますが、モジュールの読み込みとグローバル関数に関するいくつかの問題に直面しています。

私が作成しているフレームワークの主なアイデアは、関数と注釈 "@thisisatest" を含む Python ファイルをロードして、どの関数がテストであるかを伝えることです。このファイルを imp.load_source でロードし、後で、ロードしたモジュールから関数を呼び出すスレッドを生成します。それは次のようなものです:

module = imp.load_source("test", "testdir/test.py")
function = module.testFunction
thread = threading.Thread(target=function)
thread.start()

とにかく、このテストに「アサーション関数」を接続して、次のようなことをしたいと思います。

module = imp.load_source("test", "testdir/test.py")
module.__globals__.assertAndTerminate = assertionFunction
function = module.testFunction
thread = threading.Thread(target=function)
thread.start()

そして、それは大丈夫です。問題は、test.py がその内部で assertAndTerminate 関数を使用する別のモジュールをインポートするときに始まります。test.py によってロードされたモジュールは、test.py の __globals__ をまったく認識しておらず、私が話している assertAndTerminate が誰であるかを知りません (各モジュールには独自の __globals__ があるため、これは理にかなっています)。

test.py モジュールとそれによってスレッドにロードされたモジュールに同じ assertAndTerminate 関数を設定する方法を知っている人はいますか? ツリーでインポートを検索したくないのですが、可能ですか?

のようなものはありThread(target=function, global_vars=["assertAndTerminate":assertionFunction])ますか?

4

1 に答える 1

3

モジュールに属性を直接設定する必要があります。これ、そのモジュールのグローバル名前空間です:

module = imp.load_source("test", "testdir/test.py")
module.assertAndTerminate = assertionFunction

モジュールごとにグローバルを設定する必要があります。1 つのモジュールからのグローバルは、インポート時に他のモジュールに伝播されません。

モジュールに追加できます__builtin__( builtinPython 3 の場合):

import __builtin__

__builtin__.assertAndTerminate = assertionFunction

これらはすべてのモジュールで表示されます。

>>> import __builtin__
>>> __builtin__.foobar = 'barbaz'
>>> foobar
'barbaz'

一般的に言えば、これを避けるのは本当に避けたいことです。問題を解決する他の方法を見つけてください。設定されているグローバルに依存する代わりに、コードをインポートします。

于 2013-06-20T14:01:51.747 に答える