ここに:
from os.path import exists as foo
print foo.__name__
我々が得る: 'exists'
。何故なの 'foo'
?どの属性が'foo'
?
import foo as bar
は単なる割り当てとして表示できます。関数に別の名前を割り当てるときに、関数がその__name__
属性を変更することを期待しません。
>>> def foo(): pass
>>>
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
ありがとう。変数
bar
のどの属性が文字列'bar'
を返しますか?
そのような属性はありません。名前(bar
)は、値(関数オブジェクト)を一方向に参照します。
関数の__name__
属性は、関数を使用して定義された名前として設定されますdef ...
構文。そのため、匿名関数を定義し、作成後に名前foo
を割り当てると、意味のある__name__
属性を取得できません。
>>> foo = lambda: None
>>> foo.__name__
'<lambda>'
オブジェクトのインポートは新しい変数をバインドするだけで、_as newname
_を追加するだけで、変数に使用する代替名を選択できます現在のネームスペース。
オブジェクトの___name__
_属性は、現在バインドされている名前については何も示しません。結局、同じオブジェクトを指すリストや辞書などのコンテナだけでなく、任意の数の変数を持つことができます。
_def foo(): pass
bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {'monty': foo, 'python': foo}
_
上記は、関数オブジェクトへの4つの追加参照を作成しました。 _foo.__name__
_にそれらすべてを反映させることはできません。また、_list_of_functions
_および_dictionary_of_functions
_の参照には(直接)名前がありません。
_import foo
_、_import bar as foo
_、_from module import foo
_、および_from module import bar as foo
_はすべて現在のモジュールで名前foo
を設定するだけなので、他の割り当てとまったく同じように扱われます。関数を異なる名前で複数回インポートすることもできます。
代わりに、関数の___name__
_値は、def <name>(...):
ステートメントで定義された名前に設定されます。せいぜいデバッグ支援です。たとえば、トレースバックに表示されるコードの行を識別しやすくするために、トレースバックで使用されます。場所をより適切に特定するのに役立つ場合にのみ、___name__
_を他の何かに設定します。 (注:Python 3では、 ___qualname_
_属性 もあります。これは、___name__
_の代わりに使用されます。関数は、クラスでネストまたは定義されたときに定義されます)。
as
はインポートのファイル/セッション内の構文上の砂糖であり、__name__
属性は、関数オブジェクトの一部です。