Ottenere riferimenti a oggetti funzione nello stack di esecuzione dall'oggetto frame?

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

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

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top