辞書からモジュールを動的に作成したいのですが、要素を追加することsys.modules
が本当にこれを行うための最良の方法であるかどうか疑問に思っています。例えば
context = { a: 1, b: 2 }
import types
test_context_module = types.ModuleType('TestContext', 'Module created to provide a context for tests')
test_context_module.__dict__.update(context)
import sys
sys.modules['TestContext'] = test_context_module
この点に関する私の当面の目標は、タイミング テスト実行のコンテキストを提供できるようにすることです。
import timeit
timeit.Timer('a + b', 'from TestContext import *')
Timer コンストラクターは文字列だけでなくオブジェクトも受け取るため、これを行う方法は他にもあるようです。ただし、これを行う方法を学ぶことにまだ興味があります。a) 他の潜在的なアプリケーションがあるためです。b) Timer コンストラクターでオブジェクトを使用する方法が正確にわかりません。そうすることは、状況によっては、このアプローチよりも適切ではないことが判明する場合があります。
EDITS/REVELATIONS/PHOOEYS/EUREKAE:
モジュール
import *
レベルでのみ動作し、そのステートメントが実行されるコンテキストはモジュール内の関数のコンテキストであるため、タイミング テストの実行に関連するサンプル コードは実際には機能しないことに気付きました。つまり、そのコードを実行するときに使用されるグローバル ディクショナリは のグローバル ディクショナリです。これは、対話型シェルでコードを記述したときの場所だからです。したがって、これを理解するための論理的根拠は少し間違っていますが、それでも有効な質問です。testit
__main__
最初の一連の例で実行されたコードには、新しく作成されたモジュールのコードが実行される名前空間が、それ自体のモジュールではなく、宣言されたモジュールの名前空間であるという望ましくない影響があることがわかりました。これはかなり奇妙で、あらゆる種類の予期しないガラガラヘビのスケッチにつながる可能性があります。したがって、実際にグイドが注目するものである場合、これはこの種のことを意図した方法ではないと確信しています。
Python のインクルード パスにないファイルからモジュールを動的にロードするという、似ているが微妙に異なるケースは、 を使用して非常に簡単に実現でき
imp.load_source('NewModuleName', 'path/to/module/module_to_load.py')
ます。これにより、モジュールが にロードされsys.modules
ます。しかし、これは私の質問に実際には答えません。実際には、ファイルシステムのない組み込みプラットフォームでpython を実行している場合はどうなるでしょうか?
私は現在、情報過多のかなりのケースと戦っているので、間違っている可能性がありますが、imp
モジュールにはこれが可能なものはないようです.
しかし、基本的に、この時点での問題は、オブジェクトのグローバル (つまりモジュール) コンテキストを設定する方法です。もっと具体的に聞いたほうがいいのではないでしょうか?そして、より広い範囲で、オブジェクトを特定のモジュールにシューホーニングしながら、Python にこれを実行させるにはどうすればよいでしょうか?