私は 標準の例 を知っています:モジュールを直接実行する場合、__name__
グローバル変数は"__main__"
として定義されます。ただし、ドキュメントのどこにも、一般的な場合の__name__
の定義方法の正確な説明はありません。 モジュールのドキュメント は...
モジュール内では、モジュールの名前(文字列として)は、グローバル変数
__name__
の値として使用できます。
...しかし、「モジュールの名前」とはどういう意味ですか?それは単にモジュールの名前(.py
が削除されたファイル名)ですか、それとも完全修飾パッケージ名も含まれていますか?
Pythonモジュールの__name__
変数の値はどのように決定されますか?ボーナスポイントについては、この操作のPythonソースコードのどこにあるかを正確に示してください。は発表された。
インポートされたモジュールの絶対名に設定されます。 foo.bar
としてインポートした場合、__name__
は'foo.bar'
に設定されます。
名前は import.c
モジュールで決定されますが、そのモジュールはさまざまなタイプのインポート(Zipインポート、バイトコードのみのインポート、拡張モジュールなど)を処理するため、があります。トレースするいくつかのコードパス。
通常、import
ステートメントは__import__
への呼び出しに変換されます。これはデフォルトでは PyImport_ImportModuleLevelObject
への呼び出しとして実装されています です。 __import__()
documentation を参照して、引数の意味を理解してください。 PyImport_ImportModuleLevelObject
内では相対名が解決されるため、必要に応じてname
変数をそこに追跡できます。
モジュールの残りの部分は実際のインポートを処理し、PyImport_AddModuleObject
が実際の名前空間オブジェクトを作成してname
キーを設定しますが、そのname
値をPyImport_ImportModuleLevelObject
まで追跡できます。モジュールオブジェクトを作成することで、その__name__
値は moduleobject.c
オブジェクトコンストラクター に設定されます。
__name__
変数は、名前でアクセスできるモジュールの属性です。
import os
assert os.__name__ == 'os'
インポートメカニズムをスケッチする自己作成モジュールの例:
>>> import types
>>> m = types.ModuleType("name of module") # create new module with name
>>> exec "source_of_module = __name__" in m.__dict__ # execute source in module
>>> m.source_of_module
'name of module'
タイプモジュールからの行:
import sys
ModuleType = type(sys)