В Python, как я могу получить имя функции в виде строки, не вызывая функцию?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
должен выводить "my_function"
.
Доступна ли такая функция в Python? Если нет, какие-либо идеи о том, как реализовать get_function_name_as_string
, в Python?
Ответы:
Использование
__name__
является предпочтительным методом, поскольку он применяется равномерно. В отличие от этогоfunc_name
, он работает и со встроенными функциями:Также двойные подчеркивания указывают читателю, что это особый атрибут. В качестве бонуса, классы и модули тоже имеют
__name__
атрибут, поэтому вы должны помнить только одно специальное имя.источник
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. У вас есть другой выбор, который:def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Итак, ответ от Альберта Вонпуппа выглядит лучше для меня.f.__name__ == 'f'
.Чтобы получить имя текущей функции или метода изнутри, рассмотрим:
sys._getframe
также работает вместо,inspect.currentframe
хотя последний избегает доступа к частной функции.Чтобы вместо этого получить имя вызывающей функции, рассмотрите
f_back
как вinspect.currentframe().f_back.f_code.co_name
.Если также использовать
mypy
, он может жаловаться, что:Чтобы устранить вышеуказанную ошибку, рассмотрите:
источник
sys._getframe
- он напрямую связан с внутренностями CPython.sys._getframe(1).f_code.co_name
, чтобы вы могли определить подобную функциюget_func_name()
и ожидать получить желаемое имя вызывающей функции.Есть и другие забавные свойства функций. Напечатайте,
dir(func_name)
чтобы перечислить их.func_name.func_code.co_code
является скомпилированной функцией, хранящейся в виде строки.отобразит код в почти читаемом формате. :)
источник
__names__
быть закрытым,__names
особенным._names
являются частными (подчеркивание до, просто соглашение),__names__
специальными (двойное подчеркивание до и после). Не уверен, что двойное подчеркивание раньше имеет какое-либо значение, формально или как соглашение.func_name
больше не существует в python3, поэтому вам нужно использовать,func.__name__
если вы хотите совместимостьЭта функция возвращает имя функции вызывающей стороны.
Это как ответ Альберта Вонпуппа с дружелюбной оберткой.
источник
Если вы также заинтересованы в методах класса, Python 3.3+ имеет
__qualname__
в дополнение к__name__
.источник
Мне нравится использовать функцию декоратор. Я добавил класс, который также умножает время функции. Предположим, что gLog - это стандартный python logger:
так что теперь все, что вам нужно сделать с вашей функцией, это украсить ее и вуаля
источник
где
stack () [0] вызывающий
stack () [3] строковое имя метода
источник
stack()[0]
всегда будет вызывающим,[3]
строковое имя метода.В качестве продолжения ответа @ Demyn я создал несколько служебных функций, которые выводят имя текущей функции и аргументы текущей функции:
источник
sys._getframe()
не гарантируется, что он будет доступен во всех реализациях Python ( см. ссылку ), вы можете использоватьtraceback
модуль, чтобы сделать то же самое, например.Вызов
stack[-1]
возвратит текущие детали процесса.источник
sys._getframe()
не определено, тоtraceback.extract_stack
также не работает. Последний обеспечивает грубый расширенный набор функциональных возможностей первого; Вы не можете ожидать увидеть одно без другого. А на самом деле в IronPython 2.7extract_stack()
всегда возвращается[]
. -1Вы просто хотите получить имя функции, вот простой код для этого. скажем, у вас есть эти функции определены
выход будет function1
Теперь скажем, у вас есть эти функции в списке
чтобы получить название функции
выход будет
функция1
функция2
функция3
источник
Я видел несколько ответов, в которых использовались декораторы, хотя некоторые из них были немного многословны. Вот что я использую для регистрации имен функций, а также их соответствующих входных и выходных значений. Я адаптировал его здесь, чтобы просто напечатать информацию, а не создавал файл журнала, и адаптировал его для применения к конкретному примеру OP.
Вывод:
источник
debug
функцию, вы можете добавить функциональность, просто добавив декоратор к любой функции, которая вам нужна или вы хотите напечатать имя функции. Это кажется самым простым и наиболее адаптируемым.