2009-06-23 11 views
1

Bei der Ausgabe von inspect.stack(), ist es möglich, die Funktionsobjekte von irgendwo aus dem Stack-Frame zu holen und diese aufzurufen? Wenn das so ist, wie?Bezugnahmen auf Funktionsobjekte auf dem Ausführungsstapel vom Rahmenobjekt erhalten?

(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 mein Anrufer zu bestimmen, ob ein ist Generator oder eine regelmäßige Funktion? Ich muss inspect.isgeneratorfunction() auf dem Funktionsobjekt aufrufen. Und wie findest du heraus, wer dich angerufen hat? inspect.stack(), richtig? Wenn ich das irgendwie zusammenstellen kann, habe ich die Antwort auf meine Frage. Vielleicht gibt es einen einfacheren Weg, dies zu tun?

+0

Warum würden Sie nach Funktionen im Stack-Frame suchen und nicht nach dem Namespace? Zum Debuggen? –

Antwort

2

Hier ist ein Code-Snippet, das es tun. Es gibt keine Fehlerprüfung. Die Idee ist, in den Einheimischen des großen Elternteils das Funktionsobjekt zu finden, das aufgerufen wurde. Das zurückgegebene Funktionsobjekt sollte das übergeordnete Objekt sein. Wenn Sie auch die Builtins durchsuchen wollen, dann schauen Sie einfach in Stacks [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 Falle einer Klasse kann man die folgenden (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 
+0

Entschuldigung, das hat nicht für mich funktioniert :(Mit ein paar Verbesserungen habe ich es geschafft, es zu arbeiten. Danke für die Anleitung. – Marcin

+0

Mit Blick auf Ihren Code, ich denke, Sie sind in einer Klasse und abrufen Mitglied Funktion. – Eolmar

+0

Es wäre schön, Code zu haben, der unabhängig davon funktioniert, ob wir in einer Funktion oder einer Klassenmethode sind. – Casebash

0

ich Antwort der nahm den folgenden Ansatz, sehr ähnlich Eolmar schreiben.

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) 
+0

Was? ist die Isgeneratorfunktion für? – Casebash