Сообщить об ошибке.

Функции как объекты.

Все данные в программе Python представлены объектами или отношениями между объектами. Такие вещи, как строки, списки, модули и функции, являются объектами. В Python нет ничего особенного в функциях.

Так как функция в Python является объектом, ее можно присвоить другой переменной, как и любому другому объекту:

def hello(name):
    return f'Hello {name}.'

>>> say = hello

Строка say = hello не вызывает функцию. Он принимает объект функции, на который ссылается hello и создает второе имя say указывающее на нее. Теперь можно выполнить объект базовой функции hello, вызвав say:

>>> say('World')
# 'Hello World.'

Функциональные объекты и их имена являются двумя разными вещами. Вот еще одно доказательство: можно удалить исходное имя функции hello. Другое имя say по-прежнему указывает на базовую функцию hello и ее можно вызвать через функцию say:

>>> del hello
>>> hello('World')
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'hello' is not defined

>>> say('World')
# 'Hello World.'

Python присоединяет строковый идентификатор к каждой функции во время создания для целей отладки. Можете получить доступ к этому внутреннему идентификатору с помощью атрибута __name__ или __qualname__:

>>> say.__name__
'hello'
>>> say.__qualname__
'hello'

Хотя атрибут __name__ функции say() все еще hello, это не повлияет на то, как можно получить к ней доступ из кода. Этот атрибут является просто средством отладки. Переменная, указывающая на функцию и имя самой функции две разные вещи.