Amunrah
@Amunrah
Сказочный персонаж ))

Как работают переменные в декораторе?

Не могу разобраться почему:
- так функция видит перменную:
def talk(func):
    def wrap(word):           
        print(word)
    return wrap
    
@talk
def func(word):
    pass

func('yeee')

>>> yeee

- а так нет:
def talk(func):            
    print(word)

@talk
def func(word):
    pass

func('yeee')

NameError: name 'word' is not defined

Ну т.е. откуда wrap получает word, если в поле видимости talk его вроде бы и нет?..
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Python разворачивает конструкцию @talk в func = talk(func). Так как функция talk возвращает функцию wrap, после завершения "разворачивания" получается func = wrap, и вызывая func(word) вы на самом деле вызываете wrap(word).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы