Hier:
from os.path import exists as foo
print foo.__name__
wir bekommen: 'exists'
. Warum nicht 'foo'
? Welches Attribut würde 'foo'
geben?
Sie können import foo as bar
nur als Zuordnung anzeigen. Sie würden nicht erwarten, dass eine Funktion ihr __name__
-Attribut ändert, wenn Sie der Funktion einen anderen Namen zuweisen.
>>> def foo(): pass
>>>
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
Vielen Dank. Welches Attribut der Variablen
bar
würde dann die Zeichenfolge'bar'
zurückgeben?
Es gibt kein solches Attribut. Namen (bar
) beziehen sich unidirektional auf Werte (das Funktionsobjekt).
Das __name__
-Attribut einer Funktion wird als Name festgelegt, mit dem die Funktion definiert wurdedef ...
-Syntax. Deshalb erhalten Sie kein aussagekräftiges __name__
-Attribut, wenn Sie eine anonyme Funktion definieren und nach ihrer Erstellung den Namen foo
vergeben.
>>> foo = lambda: None
>>> foo.__name__
'<lambda>'
Beim Importieren eines Objekts wird nur eine neue Variable gebunden. Mit dem Hinzufügen von as newname
können Sie einen alternativen Namen für die Variable im aktuellen Namespace auswählen.
Das __name__
-Attribut eines Objekts sagt nichts über den Namen aus, an den es aktuell gebunden ist. Sie können eine beliebige Anzahl von Variablen sowie Container wie Listen oder Wörterbücher haben, die auf dasselbe Objekt verweisen.
def foo(): pass
bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {'monty': foo, 'python': foo}
Die oben erstellten 4 zusätzlichen Verweise auf das Funktionsobjekt; Sie können foo.__name__
nicht für alle diese Werte verwenden, und die Referenzen in list_of_functions
und dictionary_of_functions
haben keine Namen (direkt).
Da import foo
, import bar as foo
, from module import foo
und from module import bar as foo
im aktuellen Modul nur den Namen foo
setzen, werden sie genauso behandelt wie andere Zuweisungen. Sie können die Funktion auch mehrmals unter verschiedenen Namen importieren.
Stattdessen wird der __name__
-Wert einer Funktion auf den Namen festgelegt, mit dem er in der def <name>(...):
-Anweisung definiert wurde. Es ist höchstens eine Hilfe zur Fehlersuche. Es wird beispielsweise in Tracebacks verwendet, um die Identifizierung von Codezeilen im Traceback zu erleichtern. Sie würden den __name__
nur auf etwas anderes setzen, wenn dies den Standort besser identifizieren würde. (Hinweis: In Python 3 gibt es auch das Attribut __qualname_
, das anstelle von __name__
verwendet wird, da es weitere Informationen dazu enthält, wo die Funktion definiert ist, wenn sie in einer Klasse verschachtelt oder definiert ist.).
Die Variable as
ist in der Datei/Sitzung des Imports syntaktischer Zucker, während das Attribut __name__
Teil des Funktionsobjekts ist.