Python: Как получить имя метода вызывающего в вызываемом методе?
Предположим, у меня есть 2 метода:
def method1(self):
...
a = A.method2()
def method2(self):
...
Если я не хочу вносить какие-либо изменения для method1, как получить имя вызывающей стороны (в данном примере имя method1) в method2?
python
introspection
zs2020
источник
источник
Ответы:
inspect.getframeinfo и другие связанные функции
inspect
могут помочь:этот самоанализ призван помочь отладке и разработке; не рекомендуется полагаться на это в производственных целях.
источник
Укороченная версия:
(с благодарностью @Alex и Stefaan Lippen )
источник
Это, кажется, работает просто отлично:
источник
inspect.stack
sys
интенсивного рефакторинга модуля.Я придумал немного более длинную версию, которая пытается создать полное имя метода, включая модуль и класс.
https://gist.github.com/2151727 (версия 9cccbf)
источник
stack
, он все еще пропускает кадры из-за циклических ссылок, как объяснено в inspect-docsЯ бы использовал
inspect.currentframe().f_back.f_code.co_name
. Его использование не было рассмотрено ни в одном из предыдущих ответов, которые в основном относятся к одному из трех типов:inspect.stack
но известно, что он слишком медленный .sys._getframe
внутренняя частная функция, учитывая ее начальное подчеркивание, поэтому ее использование не рекомендуется.inspect.getouterframes(inspect.currentframe(), 2)[1][3]
но совершенно неясно, к чему[1][3]
обращаются.Обратите внимание, что
cast(FrameType, frame)
используется для удовлетворенияmypy
.Подтверждение: предварительный комментарий 1313e для ответа .
источник
Немного слияния материала выше. Но вот моя трещина в этом.
Использование:
вывод
источник
modules = [(index, inspect.getmodule(stack[index][0])) for index in reversed(range(1, min(stack_size, len(inspect.stack()))))]
чтобы получить модули.Я нашел способ, если вы переходите между классами и хотите, чтобы класс принадлежал методу и методу. Требуется немного работы по извлечению, но это имеет смысл. Это работает в Python 2.7.13.
источник
источник