webentwicklung-frage-antwort-db.com.de

Warum behält eine importierte Funktion "als" einen anderen Namen ihren ursprünglichen Namen?

Hier:

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

wir bekommen: 'exists'. Warum nicht 'foo'? Welches Attribut würde 'foo' geben?

18
Basj

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 wurde
def ...-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>'
35
timgeb

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.).

16
Martijn Pieters

Die Variable as ist in der Datei/Sitzung des Imports syntaktischer Zucker, während das Attribut __name__ Teil des Funktionsobjekts ist.

0
halloleo