Obtenção de referências a objetos de função na pilha de execução do objeto frame?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Dada a saída do inspect.stack(), é possível obter os objetos de função de qualquer lugar do quadro de pilha e chamar essas? Se sim, como?

(Eu já sei como obter os nomes das funções.)

Aqui está o que eu estou chegando: Vamos dizer que eu sou uma função e eu estou tentando determinar se o meu interlocutor é um gerador ou uma função regular? Preciso ligar para inspect.isgeneratorfunction() no objeto função. E como você descobrir quem você ligou? inspect.stack(), certo? Então se eu posso de alguma forma colocar esses juntos, eu vou ter a resposta para a minha pergunta. Talvez haja uma maneira mais fácil de fazer isso?

Foi útil?

Solução

Aqui está um trecho de código que fazê-lo. Não há verificação de erros. A idéia é encontrar nos habitantes do grande pai do objeto função que foi chamado. O objeto de função retornado deve ser o pai. Se você também quiser procurar os builtins, em seguida, basta olhar para pilhas [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]

No caso de uma classe, pode-se escrever o seguinte (inspirado solução 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

Outras dicas

Eu levei a abordagem seguinte, muito semelhante à resposta de 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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top