Python: Wie erhalte ich den Methodennamen des Aufrufers in der aufgerufenen Methode?
Angenommen, ich habe 2 Methoden:
def method1(self):
...
a = A.method2()
def method2(self):
...
Wenn ich für Methode1 keine Änderung vornehmen möchte, wie erhalte ich den Namen des Aufrufers (in diesem Beispiel lautet der Name Methode1) in Methode2?
python
introspection
zs2020
quelle
quelle
Antworten:
inspect.getframeinfo und andere verwandte Funktionen in
inspect
können helfen:Diese Selbstbeobachtung soll das Debuggen und die Entwicklung unterstützen. Es ist nicht ratsam, sich aus Gründen der Produktionsfunktionalität darauf zu verlassen.
quelle
Kürzere Version:
(danke an @Alex und Stefaan Lippen )
quelle
Dies scheint gut zu funktionieren:
quelle
inspect.stack
sys
einem umfangreichen Refactoring des Moduls fehlschlagen kann .Ich habe mir eine etwas längere Version ausgedacht, die versucht, einen vollständigen Methodennamen einschließlich Modul und Klasse zu erstellen.
https://gist.github.com/2151727 (rev 9cccbf)
quelle
stack
, leckt es immer noch Frames aufgrund von kreisförmigen Verweisen, wie in denIch würde verwenden
inspect.currentframe().f_back.f_code.co_name
. Seine Verwendung wurde in keiner der vorherigen Antworten behandelt, die hauptsächlich von einer von drei Arten sind:inspect.stack
aber es ist bekannt, dass es zu langsam ist .sys._getframe
handelt es sich um eine interne private Funktion, die aufgrund ihres führenden Unterstrichs eine interne Funktion darstellt. Daher wird von ihrer Verwendung implizit abgeraten.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
aber es ist völlig unklar, auf was[1][3]
zugegriffen wird.Beachten Sie, dass
cast(FrameType, frame)
verwendet wird, um zu befriedigenmypy
.Danksagung: vorheriger Kommentar von 1313e für eine Antwort .
quelle
Eine Art Zusammenschluss der oben genannten Dinge. Aber hier ist mein Knaller.
Verwenden:
Ausgabe ist
quelle
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
, um die Module zu erhalten.Ich habe einen Weg gefunden, wenn Sie über Klassen gehen und die Klasse wollen, zu der die Methode gehört, UND die Methode. Es erfordert ein wenig Extraktionsarbeit, aber es macht seinen Sinn. Dies funktioniert in Python 2.7.13.
quelle
quelle