web-dev-qa-db-ja.com

インポートされた関数が別の名前として「元の」元の__name__を保持するのはなぜですか?

ここに:

from os.path import exists as foo
print foo.__name__

我々が得る: 'exists'。何故なの 'foo'?どの属性が'foo'

18
Basj

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>'
35
timgeb

オブジェクトのインポートは新しい変数をバインドするだけで、_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___の代わりに使用されます。関数は、クラスでネストまたは定義されたときに定義されます)。

16
Martijn Pieters

asはインポートのファイル/セッション内の構文上の砂糖であり、__name__属性は、関数オブジェクトの一部です。

0
halloleo