web-dev-qa-db-ja.com

Pythonモジュールの__name__変数はどのように定義されていますか?

私は 標準の例 を知っています:モジュールを直接実行する場合、__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オブジェクトコンストラクター に設定されます。

27
Martijn Pieters

__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)
2
User