Вопрос-Ответ

How to get a function name as a string?

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

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

def foo():
pass

>>> name_of(foo)
"foo"
Переведено автоматически
Ответ 1
my_function.__name__

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

Ответ 2

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

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, он может пожаловаться, что:


ошибка: элемент "None" из "Optional [FrameType]" не имеет атрибута "f_code"


Чтобы устранить вышеуказанную ошибку, рассмотрим:

import inspect
import types
from typing import cast

this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name
Ответ 3

Если вас тоже интересуют методы класса, в Python 3.3+ есть __qualname__ в дополнение к __name__.

def my_function():
pass

class MyClass(object):
def method(self):
pass

print(my_function.__name__) # gives "my_function"
print(MyClass.method.__name__) # gives "method"

print(my_function.__qualname__) # gives "my_function"
print(MyClass.method.__qualname__) # gives "MyClass.method"
Ответ 4
my_function.func_name

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

import dis
dis.dis(my_function)

отобразит код в почти удобочитаемом формате. :)

python string function