Как получить имя функции в виде строки?
Как получить имя функции в виде строки?
def foo():
pass
>>> name_of(foo)
"foo"
5 ответ(ов)
Использование атрибута __name__
является предпочтительным методом, так как он применяется последовательно ко всем объектам. В отличие от func_name
, __name__
работает и с встроенными функциями:
>>> import time
>>> time.time.func_name
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__
'time'
Кроме того, двойное подчеркивание указывает читателю на то, что это специальный атрибут. В качестве бонуса, у классов и модулей также есть атрибут __name__
, так что вам нужно запомнить только одно специальное имя.
Чтобы получить имя текущей функции или метода изнутри него, можно использовать следующий код:
import inspect
this_function_name = inspect.currentframe().f_code.co_name
Также работает sys._getframe
, однако использование inspect.currentframe
предпочтительнее, чтобы избежать обращения к приватным функциям.
Если вам нужно получить имя вызывающей функции, можно использовать f_back
следующим образом: inspect.currentframe().f_back.f_code.co_name
.
Если вы также используете mypy
, он может выдать предупреждение о том, что:
error: Item "None" of "Optional[FrameType]" has no attribute "f_code"
Чтобы подавить эту ошибку, можно сделать следующее:
import inspect
import types
from typing import cast
this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name
Если вас также интересуют методы классов, то в Python 3.3 и выше помимо __name__
доступен атрибут __qualname__
.
def my_function():
pass
class MyClass(object):
def method(self):
pass
print(my_function.__name__) # выводит "my_function"
print(MyClass.method.__name__) # выводит "method"
print(my_function.__qualname__) # выводит "my_function"
print(MyClass.method.__qualname__) # выводит "MyClass.method"
Таким образом, __qualname__
предоставляет полное квалифицированное имя функции или метода, включая название класса, если это применимо.
Функции также обладают интересными свойствами. Введите dir(func_name)
, чтобы получить их список. func_name.func_code.co_code
представляет собой скомпилированный код функции, хранящийся в виде строки.
Для отображения кода в почти читаемом формате можно использовать следующую команду:
import dis
dis.dis(my_function)
Это покажет байт-код вашей функции. 😃
Конечно! Вот перевод на русский в стиле ответа на StackOverflow:
Ваш код использует модуль inspect
, чтобы получить информацию о текущем состоянии выполненной программы. В частности, вы используете inspect.stack()
, чтобы получить стек вызовов.
В строке inspect.stack()[0][3]
вы получаете имя вызывающей функции, так как stack()[0]
ссылается на текущую функцию (в данном случае это foo
), а stack()[3]
ссылается на функцию, которая находится на третьем уровне стека. Если вам нужно получить строковое имя метода (или функции), вызывающей foo
, то вы можете использовать stack()[1][3]
, если ваша функция foo
вызывается из одной функции.
Пример кода с небольшими изменениями, чтобы получить имя вызывающей функции:
import inspect
def foo():
print(inspect.stack()[1][3]) # изменяем индекс на 1 для получения имени вызывающей функции
def bar():
foo() # вызываем foo из bar
bar() # В результате выполнения данного кода выведется 'bar'
Таким образом, этот код напечатает имя функции bar
, которая вызвала foo
.
Если у вас есть еще вопросы, не стесняйтесь спрашивать!
Есть ли в Python метод подстроки 'contains' для строк?
Как удалить пробелы?
Объединение двух столбцов текста в DataFrame pandas
Как проверить, пуста ли строка в Python?
Вывод строки в текстовый файл