Beziehen Referenzen Objekte auf dem Ausführungsstapel aus dem Frame-Objekt funktionieren?
-
06-07-2019 - |
Frage
die Ausgabe von inspect.stack()
Gegeben ist es möglich, die Funktionsobjekte von überall aus dem Stapelrahmen zu erhalten und diese nennt? Wenn ja, wie?
(ich weiß schon, wie die Namen der Funktionen zu erhalten.)
Hier ist, was ich hinaus will: Lassen Sie uns sagen, ich bin eine Funktion, und ich versuche, um zu bestimmen, ob mein Anrufer ein Generator oder eine reguläre Funktion? Ich muss auf die Funktion Objekt aufzurufen inspect.isgeneratorfunction()
. Und wie Sie herausfinden, wer Sie angerufen? inspect.stack()
, nicht wahr? Also, wenn ich irgendwie diejenigen zusammen, werde ich die Antwort auf meine Frage. Vielleicht gibt es einen einfacheren Weg, dies zu tun?
Lösung
Hier ist ein Code-Schnipsel, die es tun. Es gibt keine Fehlerprüfung. Die Idee ist, in den Einheimischen der großen Mutter das Funktionsobjekt zu finden, die aufgerufen wurde. Die Funktion Objekt zurückgegeben sollte die Eltern sein. Wenn Sie wollen auch die builtins suchen, dann schauen Sie einfach in Stapeln [2] [0] .f_builtins.
def f():
stacks = inspect.stack()
grand_parent_locals = stacks[2][0].f_locals
caller_name = stacks[1][3]
candidate = grand_parent_locals[caller_name]
Im Fall einer Klasse kann man schreibt die folgende (inspiriert von Marcin Lösung)
class test(object):
def f(self):
stack = inspect.stack()
parent_func_name = stack[1][3]
parent_func = getattr(self, parent_func_name).im_func
Andere Tipps
Ich habe den folgenden Ansatz, sehr ähnlich Eolmar Antwort.
stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)