Wie erhalte ich in Python einen Funktionsnamen als Zeichenfolge, ohne die Funktion aufzurufen?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
sollte ausgeben "my_function"
.
Ist eine solche Funktion in Python verfügbar? Wenn nicht, irgendwelche Ideen zur Implementierung get_function_name_as_string
in Python?
Antworten:
Die Verwendung
__name__
ist die bevorzugte Methode, da sie einheitlich angewendet wird. Im Gegensatzfunc_name
dazu funktioniert es auch mit integrierten Funktionen:Auch die doppelten Unterstriche zeigen dem Leser an, dass dies ein besonderes Attribut ist. Als Bonus haben Klassen und Module auch ein
__name__
Attribut, sodass Sie sich nur einen speziellen Namen merken müssen.quelle
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. Sie haben eine andere Wahl :def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Die Antwort von Albert Vonpupp sieht für mich also besser aus.f.__name__ == 'f'
.Beachten Sie Folgendes, um den Namen der aktuellen Funktion oder Methode darin abzurufen:
sys._getframe
funktioniert auch anstattinspect.currentframe
obwohl letzterer den Zugriff auf eine private Funktion vermeidet.Um stattdessen den Namen der aufrufenden Funktion zu erhalten, betrachten Sie
f_back
wie ininspect.currentframe().f_back.f_code.co_name
.Wenn auch verwendet
mypy
, kann es sich beschweren, dass:Beachten Sie Folgendes, um den obigen Fehler zu unterdrücken:
quelle
sys._getframe
- es ist direkt mit den Interna von CPython verbunden.sys._getframe(1).f_code.co_name
, damit Sie eine Funktion wie definierenget_func_name()
und erwarten können, den gewünschten Namen der aufgerufenen Funktion zu erhalten.Es gibt auch andere lustige Eigenschaften von Funktionen. Geben Sie ein,
dir(func_name)
um sie aufzulisten.func_name.func_code.co_code
ist die kompilierte Funktion, die als Zeichenfolge gespeichert wird.zeigt den Code in einem fast für Menschen lesbaren Format an. :) :)
quelle
__names__
sind privat,__names
sind speziell._names
privat ist (einzelner Unterstrich vorher, nur eine Konvention), etwas__names__
Besonderes ist (doppelter Unterstrich vorher und nachher). Ich bin mir nicht sicher, ob ein doppelter Unterstrich zuvor formal oder als Konvention eine Bedeutung hat.func_name
existiert nicht mehr in Python3, daher müssen Sie es verwenden,func.__name__
wenn Sie Kompatibilität wünschenDiese Funktion gibt den Funktionsnamen des Anrufers zurück.
Es ist wie die Antwort von Albert Vonpupp mit einem freundlichen Umschlag.
quelle
Wenn Sie sich auch für Klassenmethoden interessieren, bietet Python 3.3+
__qualname__
zusätzlich zu__name__
.quelle
Ich benutze gerne einen Funktionsdekorateur. Ich habe eine Klasse hinzugefügt, die auch die Funktionszeit mal. Angenommen, gLog ist ein Standard-Python-Logger:
Jetzt müssen Sie nur noch mit Ihrer Funktion dekorieren und voila
quelle
sys._getframe()
Es ist nicht garantiert, dass es in allen Implementierungen von Python verfügbar ist ( siehe Ref. ). Sie können dastraceback
Modul verwenden, um dasselbe zu tun, z.Ein Aufruf von
stack[-1]
gibt die aktuellen Prozessdetails zurück.quelle
sys._getframe()
undefiniert, danntraceback.extract_stack
ist auch nicht funktionsfähig. Letzteres bietet eine grobe Obermenge der Funktionalität des ersteren; Sie können nicht erwarten, eins ohne das andere zu sehen. Tatsächlichextract_stack()
kehrt in IronPython 2.7 immer zurück[]
. -1wo
stack () [0] der Aufrufer
stack () [3] der Stringname der Methode
quelle
stack()[0]
wird immer der Aufrufer sein,[3]
der Stringname der Methode.Als Erweiterung der Antwort von @ Demyn habe ich einige Dienstprogrammfunktionen erstellt, die den Namen der aktuellen Funktion und die Argumente der aktuellen Funktion drucken:
quelle
Sie möchten nur den Namen der Funktion erhalten, hier ist ein einfacher Code dafür. Angenommen, Sie haben diese Funktionen definiert
Die Ausgabe ist function1
Angenommen, Sie haben diese Funktionen in einer Liste
um den Namen der Funktionen zu erhalten
die Ausgabe wird sein
Funktion1
Funktion2
Funktion3
quelle
Ich habe ein paar Antworten gesehen, bei denen Dekorateure zum Einsatz kamen, obwohl ich der Meinung war, dass einige etwas ausführlich waren. Hier ist etwas, das ich zum Protokollieren von Funktionsnamen sowie ihrer jeweiligen Eingabe- und Ausgabewerte verwende. Ich habe es hier angepasst, um nur die Informationen zu drucken, anstatt eine Protokolldatei zu erstellen, und es angepasst, um es auf das OP-spezifische Beispiel anzuwenden.
Ausgabe:
quelle
debug
Sie durch einfaches Hinzufügen der Funktion die Funktionalität hinzufügen können, indem Sie einfach den Dekorator zu jeder Funktion hinzufügen, die Sie benötigen oder den Funktionsnamen drucken möchten. Es scheint das einfachste und anpassungsfähigste zu sein.