Beziehen Referenzen Objekte auf dem Ausführungsstapel aus dem Frame-Objekt funktionieren?

StackOverflow https://stackoverflow.com/questions/1034688

  •  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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top