Python: Como obter o nome do método do chamador no método chamado?
Suponha que eu tenha 2 métodos:
def method1(self):
...
a = A.method2()
def method2(self):
...
Se eu não quiser fazer nenhuma alteração no método1, como obter o nome do chamador (neste exemplo, o nome é método1) no método2?
python
introspection
zs2020
fonte
fonte
Respostas:
O inspect.getframeinfo e outras funções relacionadas no
inspect
podem ajudar:essa introspecção visa ajudar a depuração e desenvolvimento; não é aconselhável confiar nele para fins de funcionalidade de produção.
fonte
Versão mais curta:
(com agradecimentos a @Alex e Stefaan Lippen )
fonte
Isso parece funcionar muito bem:
fonte
inspect.stack
sys
módulo receber uma refatoração pesada.Eu vim com uma versão um pouco mais longa que tenta criar um nome de método completo, incluindo módulo e classe.
https://gist.github.com/2151727 (rev 9cccbf)
fonte
stack
, ainda vazamentos quadros devido a refs cirular como explicado na inspecionar-docsEu usaria
inspect.currentframe().f_back.f_code.co_name
. Seu uso não foi abordado em nenhuma das respostas anteriores, principalmente de um dos três tipos:inspect.stack
mas sabe-se que são muito lentas .sys._getframe
uma função privada interna, dado seu sublinhado principal e, portanto, seu uso é implicitamente desencorajado.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
mas não está totalmente claro o que[1][3]
está acessando.Observe que
cast(FrameType, frame)
é usado para satisfazermypy
.Agradecimento: comentário anterior de 1313e para obter uma resposta .
fonte
Um pouco de uma amálgama das coisas acima. Mas aqui está a minha rachadura.
Usar:
saída é
fonte
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
para obter os módulos.Eu encontrei uma maneira, se você estiver passando por classes e quiser a classe à qual o método pertence AND. É preciso um pouco de trabalho de extração, mas faz sentido. Isso funciona no Python 2.7.13.
fonte
fonte