Получить имя вызывающей функции внутри другой функции в Python? - PullRequest
98 голосов
/ 23 мая 2009

Если у вас есть 2 функции, такие как:

def A
def B

и A вызывает B, вы можете узнать, кто звонит B внутри B, например:

def A () :
    B ()

def B () :
    this.caller.name

Ответы [ 5 ]

149 голосов
/ 23 мая 2009

Вы можете использовать модуль inspect , чтобы получить необходимую информацию. Его метод stack возвращает список записей фреймов.

  • Для 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)
    

    по вышеуказанному коду.

21 голосов
/ 28 января 2015

Существует два способа использования модулей 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's frame."""
    return getouterframes(sys._getframe(1), context)
13 голосов
/ 23 мая 2009

Примечание (июнь 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, на который следует бездумно полагаться.

7 голосов
/ 23 июля 2016

Это работает для меня! : D

>>> def a():
...     import sys
...     print sys._getframe(1).f_code.co_name
...
>>> def b():
...     a()
...
...
>>> b()
b
>>>
2 голосов
/ 24 июля 2012

вы можете использовать модуль регистрации и указать опцию% (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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...