コメントがすでに示しているように、今日の Python では、組み込みの名前を持たない型をインスタンス化するための推奨される方法は、標準ライブラリのtypesモジュールを介して取得した型を呼び出すことです。
>>> import types
>>> m = types.ModuleType('m', 'The m module')
これは新しいモジュールを に自動的に挿入しないことに注意してくださいsys.modules
:
>>> import sys
>>> sys.modules['m']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'm'
これは、手動で実行する必要があるタスクです。
>>> sys.modules['m'] = m
>>> sys.modules['m']
<module 'm' (built-in)>
モジュールのコード オブジェクトは通常、モジュールが に追加された後sys.modules
に実行されるため、これは重要なsys.modules[__name__]
場合がありKeyError
ます。 このステップの後m.__file__
、編集で既に行っているように設定します。
>>> code = compile("a=23", "m.py", "exec")
>>> exec code in m.__dict__
>>> m.a
23
(または Python 3exec
が関数である場合は、Python 3 に相当するものです。もちろん、Python 3 を使用している場合は ;-) は正しいです (もちろん、通常は、文字列をコンパイルするよりも微妙な方法でコード オブジェクトを取得しますが、それはあなたの質問にとって重要ではありません;-)。
古いバージョンの Pythonでは、new
モジュールの代わりにモジュールを使用types
して、最初に新しいモジュール オブジェクトを作成していましたがnew
、Python 2.6 以降では非推奨であり、Python 3 では削除されています。