Если у вас есть 2 функции:
def A
def B
и A вызывает B, вы можете получить, кто вызывает B внутри B, например:
def A () :
B ()
def B () :
this.caller.name
Если у вас есть 2 функции:
def A
def B
и A вызывает B, вы можете получить, кто вызывает B внутри B, например:
def A () :
B ()
def B () :
this.caller.name
Вы можете использовать модуль inspect, чтобы получить необходимую информацию. Его метод стека возвращает список записей фреймов.
Для Python 2 каждая запись кадра является списком. Третий элемент в каждой записи - имя звонящего. Что вы хотите, это:
>>> import inspect
>>> def f():
... print inspect.stack()[1][3]
...
>>> def g():
... f()
...
>>> g()
g
Для Python 3. 5+ каждая запись кадра - это кортеж с именем, поэтому вам нужно заменить
print inspect.stack()[1][3]
с
print(inspect.stack()[1].function)
в приведенном выше коде.
Существует два способа использования модулей sys
и inspect
:
sys._getframe(1).f_code.co_name
inspect.stack()[1][3]
Форма stack()
менее читаема и зависит от реализации, поскольку она вызывает sys._getframe()
, см. извлечение из inspect.py
:
def stack(context=1):
"""Return a list of records for the stack above the caller frame."""
return getouterframes(sys._getframe(1), context)
Примечание (июнь 2018 г.): сегодня я бы, наверное, использовал модуль inspect
, см. Другие ответы
sys._getframe(1).f_code.co_name
как в примере ниже:
>>> def foo():
... global x
... x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>
Важное примечание: как видно из имени метода _getframe
(эй, оно начинается с подчеркивания), это не метод API, на который следует бездумно полагаться.
Это работает для меня!: D
>>> def a():
... import sys
... print sys._getframe(1).f_code.co_name
...
>>> def b():
... a()
...
...
>>> b()
b
>>>
Вы можете использовать модуль регистрации и указать опцию% (funcName) s в BaseConfig()
import logging
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s')
def A():
logging.info('info')