Как получить имя функции в виде строки?
Как получить имя функции в виде строки?
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' для строк?
Как перевернуть строку в Python?
Вывод строки в текстовый файл
Как заполнить строку в Python пробелами?
Диапазон букв в Python