11

Как получить имя функции в виде строки?

12

Как получить имя функции в виде строки?

def foo():
    pass

>>> name_of(foo) "foo"

5 ответ(ов)

14

Использование атрибута __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__, так что вам нужно запомнить только одно специальное имя.

4

Чтобы получить имя текущей функции или метода изнутри него, можно использовать следующий код:

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
0

Если вас также интересуют методы классов, то в 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__ предоставляет полное квалифицированное имя функции или метода, включая название класса, если это применимо.

0

Функции также обладают интересными свойствами. Введите dir(func_name), чтобы получить их список. func_name.func_code.co_code представляет собой скомпилированный код функции, хранящийся в виде строки.

Для отображения кода в почти читаемом формате можно использовать следующую команду:

import dis
dis.dis(my_function)

Это покажет байт-код вашей функции. 😃

0

Конечно! Вот перевод на русский в стиле ответа на 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.

Если у вас есть еще вопросы, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь