Python: ¿Cómo obtener el nombre del método de la persona que llama en el método llamado?
Supongamos que tengo 2 métodos:
def method1(self):
...
a = A.method2()
def method2(self):
...
Si no quiero hacer ningún cambio para el método1, ¿cómo obtener el nombre de la persona que llama (en este ejemplo, el nombre es método1) en el método2?
python
introspection
zs2020
fuente
fuente
Respuestas:
inspect.getframeinfo y otras funciones relacionadas en
inspect
pueden ayudar:esta introspección está destinada a ayudar a la depuración y el desarrollo; No es recomendable confiar en él para fines de funcionalidad de producción.
fuente
Versión más corta:
(con agradecimiento a @Alex y Stefaan Lippen )
fuente
Esto parece funcionar bien:
fuente
inspect.stack
sys
módulo obtenga una refactorización considerable.Se me ocurrió una versión un poco más larga que intenta construir un nombre de método completo que incluya módulo y clase.
https://gist.github.com/2151727 (rev 9cccbf)
fuente
stack
, todavía pierde marcos debido a referencias circulares como se explica en los documentos de inspecciónMe gustaría utilizar
inspect.currentframe().f_back.f_code.co_name
. Su uso no ha sido cubierto en ninguna de las respuestas anteriores que son principalmente de uno de los tres tipos:inspect.stack
pero se sabe que es demasiado lento .sys._getframe
una función privada interna dado su subrayado principal, por lo que se desaconseja implícitamente su uso.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
pero no está del todo claro qué[1][3]
está accediendo.Tenga en cuenta que
cast(FrameType, frame)
se utiliza para satisfacermypy
.Agradecimientos: comentario previo de 1313e para una respuesta .
fuente
Un poco de amalgama de las cosas de arriba. Pero aquí está mi oportunidad.
Utilizar:
la salida es
fuente
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
para obtener los módulos.Encontré una manera si vas a cruzar las clases y quieres la clase a la que pertenece el método Y el método. Toma un poco de trabajo de extracción pero hace su punto. Esto funciona en Python 2.7.13.
fuente
fuente