Как работает функция внутри функции?

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

def logged(hello):
    def new_hello(username):
        print('Arguments:', username)
        result = hello(username)
        print('Result:', result)
        return result

    return new_hello


def hello(username):
    return f"Привет, {username}"


hello = logged(hello)
hello('Вася')

Вывод:

Arguments: Вася
Result: Привет, Вася

Каким образом в logged передав Вася, получился Привет Вася? Заранее спасибо


Ответы (1 шт):

Автор решения: CrazyElf

logged всего лишь возвращает ссылку на функцию new_hello, вы эту ссылку присваиваете переменной hello и когда вы потом пишете hello('Вася') вы таким образом вызываете new_hello('Вася'), вроде тут всё просто.

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

До строки hello = logged(hello) переменная hello глобальной области видимости указывала на функцию hello, а после этой строки она стала указывать на функцию new_hello. При этом в самой функции new_hello осталась ссылка на старую функцию hello на момент когда отработал def.

→ Ссылка