Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2009 08:51:55

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

про декораторы

Есть код взятый из http://habrahabr.ru/blogs/python/46306/ :

def empty(f):
return None

@empty
def func(x, y):
return x + y

print func # напечатает: None
Не могу понять, почему при вызове func не указываются переменные x,y?
Подскажите как работает данный код…
P.S. наверно читаю невнимательно….



Офлайн

#2 Июнь 28, 2009 10:42:59

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

про декораторы

Простой пример (декорирующая функция возвращает None, в итоге func тоже оказывается равным None)
Вы это осмыслили?



Офлайн

#3 Июнь 28, 2009 11:09:28

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

про декораторы

при обработке должно вывести “”“None”“”

Офлайн

#4 Июнь 28, 2009 14:19:22

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

про декораторы

Daevaorn
Простой пример (декорирующая функция возвращает None, в итоге func тоже оказывается равным None)
Вы это осмыслили?
empty() возвращает None понимаю. Но не понимаю, почему func оказывается равным None! Почему?



Офлайн

#5 Июнь 28, 2009 15:14:59

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

про декораторы

декоратор

@empty
def func(x, y):
...
идентичен коду
def func(x, y):
...
func = empty(func)
см PEP 318



Отредактировано (Июнь 28, 2009 15:15:23)

Офлайн

#6 Июнь 28, 2009 16:20:05

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

про декораторы

вы сократили следующий код:

def empty(f):
return None

def func(x, y):
return x + y

func = empty(func)
print func
?
т.е. определение функции
def func(x, y):
return x + y
даже не нужно? функция func(x, y) не вызывается! а присваивается переменная func !
Верно понимаю?
P.S. извините за тупость. в английском не силён.



Отредактировано (Июнь 28, 2009 17:53:27)

Офлайн

#7 Июнь 28, 2009 18:41:30

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

про декораторы

j2a
см PEP 318
Спасибо за ссылочку! Кажется начинаю догонять:
@dec2
@dec1
def func(arg1, arg2, ...):
pass
This is equivalent to:
def func(arg1, arg2, ...):
pass
func = dec2(dec1(func))
то есть декоратор создает правила преобразования (из примера dec2 и dec1) результатов функции func?



Отредактировано (Июнь 28, 2009 19:58:52)

Офлайн

#8 Июнь 28, 2009 18:53:17

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

про декораторы

qman
то есть декоратор создает правила преобразования (из примера dec2 и dec1) результатов функции func?
не только результатов. Он создает “обертку” вокруг функции, так что можно модифицировать входные и выходные значение, проверять их, делать какие-либо операции в зависимости от действий и прочее.



Офлайн

#9 Июнь 30, 2009 19:03:51

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

про декораторы

извините за тупизм

@dec1
def func(arg1, arg2, ...):
pass
dec1 модифицирует входные или выходные значения функции func?



Офлайн

#10 Июнь 30, 2009 19:57:26

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

про декораторы

qman
извините за тупизм
@dec1
def func(arg1, arg2, ...):
pass
dec1 модифицирует входные или выходные значения функции func?
чтобы ответить, нужно видеть код декоратора, потому что он может менять как входные, так и выходные.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version