2013-04-08 5 views
18

私はthe standard exampleを認識しています。モジュールを直接実行すると、__name__グローバル変数は"__main__"と定義されます。しかし、文書のどこにも、一般的な場合に__name__がどのように定義されているかについての正確な説明はありません。 module documentationは、モジュール内の...Pythonモジュールの__name__変数はどのように定義されていますか?

を言う、(文字列として)モジュールの名前はグローバル変数__name__の値として使用可能です。

...「モジュールの名前」とはどういう意味ですか?モジュール名(ファイル名は.pyが削除されています)か、それとも完全修飾パッケージ名も含まれていますか?

Pythonモジュール内の__name__変数の値はどのようにして決定されますか?ボーナスポイントについては、この操作がPythonソースコードのどこで実行されているかを正確に示します。

+0

私はそこにこの質問のバリエーションを見たことがありますが、誰かがそのテーマをより深く理解してくれてうれしいです。 –

答えて

20

インポートとしてそれはモジュールの絶対名に設定されている輸入機構をscetches

import os 
assert os.__name__ == 'os' 

例自己作成モジュール。 foo.barとしてインポートした場合、__name__'foo.bar'に設定されます。

import.cモジュールで決定されるが、そのモジュールは、(ジップ輸入、バイトコードのみの輸入と拡張モジュールを含む)の輸入の様々な異なるタイプを処理するため介してトレースするいくつかコードパスがあります。

通常、importの文は、__import__(デフォルトではimplemented as a call to PyImport_ImportModuleLevelObject)の呼び出しに変換されます。引数の意味を理解するには、__import__() documentationを参照してください。 PyImport_ImportModuleLevelObjectの中には、相対名が解決されているので、必要に応じてnameの変数を追跡することができます。

モジュールの残りの部分はPyImport_AddModuleObjectは、実際の名前空間オブジェクトを作成し、nameキーを設定することで、実際の輸入を扱うが、あなたは戻ってPyImport_ImportModuleLevelObjectにそのname値をトレースすることができます。モジュールオブジェクトを作成すると、moduleobject.c object constructorに値__name__が設定されます。

+2

さらに、' import'の 'as'サブクエリーは' __name__'アトリビュートを変更しません。 – andy

2

__name__変数は、名前でアクセス可能なモジュールの属性です。タイプモジュールから

>>> 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) 
+1

Python 3では、 'exec'は関数です: ' exec( "source_of_module = __name__"、m .__ dict __) ' –

関連する問題