Ottenere riferimenti a oggetti funzione nello stack di esecuzione dall'oggetto frame?
-
06-07-2019 - |
Domanda
Dato l'output di inspect.stack ()
, è possibile ottenere gli oggetti funzione da qualsiasi punto del frame dello stack e chiamarli? In tal caso, come?
(So già come ottenere i nomi delle funzioni.)
Ecco cosa sto ottenendo: diciamo che sono una funzione e sto cercando di determinare se il mio chiamante è un generatore o una funzione regolare? Devo chiamare inspect.isgeneratorfunction ()
sull'oggetto funzione. E come capisci chi ti ha chiamato? inspect.stack ()
, giusto? Quindi, se posso in qualche modo metterli insieme, avrò la risposta alla mia domanda. Forse c'è un modo più semplice per farlo?
Soluzione
Ecco uno snippet di codice che lo fa. Non ci sono errori nel controllo. L'idea è di trovare nei locali del nonno l'oggetto funzione chiamato. L'oggetto funzione restituito dovrebbe essere il genitore. Se vuoi cercare anche i builtin, cerca semplicemente negli stack [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]
Nel caso di una classe, si può scrivere quanto segue (ispirato alla soluzione Marcin)
class test(object):
def f(self):
stack = inspect.stack()
parent_func_name = stack[1][3]
parent_func = getattr(self, parent_func_name).im_func
Altri suggerimenti
Ho adottato il seguente approccio, molto simile alla risposta di Eolmar.
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)