Я пытаюсь понять, зачем мне нужна еще одна вложенная функция при использовании декораторов. Вот пример:
def func(f):
def deco(*args, **kwargs):
return f(*args, **kwargs)
return deco
@func
def sum(a, b):
return a+b
print sum(5, 10)
Код работает, все нормально. Но зачем мне создавать вложенную функцию «деко»? Попробуем без него:
def func(f):
return f(*args, **kwargs)
@func
def sum(a, b):
return a+b
print sum(5, 10)
Код не работает.
Итак, есть три вопроса:
- Почему второй образец не работает?
- Почему args, kwargs "волшебным образом" появляются, если мы используем вложенную функцию?
- Что я могу сделать, чтобы второй образец заработал? Разумеется, кроме вложения другой функции.
*args
и**kwargs
не появляются волшебным образом, аргументы будут определены только после того, как вы вызовете свою декорированную функцию (stackoverflow.com/questions/36901/) - person Julien Spronck   schedule 06.04.2015func(f)
возвращает результат вызова функции. Но декоратор должен вернуть функцию (которая еще не была вызвана). - person Lukas Graf   schedule 06.04.2015sum = func(sum)
,args
иkwargs
, значение имеет только тогда, когда вы вызываете это новое определениеsum
. - person AChampion   schedule 06.04.2015