Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2015 07:12:43

technobot
Зарегистрирован: 2015-11-29
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Декораторы

Думаю задам не один вопрос по юзанию декораторов поскольку толком ни черта не понимаю(

допустим есть следующий код

def repeat(func):
    def wrapper(*args, **kwargs):
        for i in range(7):
            func(*args, **kwargs)
    return wrapper
@repeat
def speak(line):
    print(line)
speak("Пожалуй это строка")

1. Функция speak попадает в декоратор repeat, функция speak принимает один единственный аргумент который после попадания в декоратор магическим образом передается в аргументы функции wrapper?

2. Зачем вообще функция wrapper если можно выполнить все в теле функции repeat?

3. Используется цикл for но его итератор не используется, как так?

4. Зачем вообще нужны декораторы?
Разъясните пожалуйста

Офлайн

#2 Дек. 6, 2015 07:44:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Декораторы

Вот с декоратором

>>> def repeat(func):
...     def wrapper(*args, **kwargs):
...         for i in range(7):
...             func(*args, **kwargs)
...     return wrapper
... 
>>> @repeat
... def speak(line):
...     print(line)
... 
>>> speak("Пожалуй это строка")
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
>>>

А вот то же самое
>>> def repeat(func):
...     def wrapper(*args, **kwargs):
...         for i in range(7):
...             func(*args, **kwargs)
...     return wrapper
... 
>>> def speak(line):
...     print(line)
... 
>>> speak = repeat(speak)
>>> 
>>> speak("Пожалуй это строка")
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
Пожалуй это строка
>>>

technobot
4. Зачем вообще нужны декораторы?
Чтобы не менять функцию, которая декорируется.

>>> def repeat2(func):
...     def wrapper(*args, **kwargs):
...         for i in range(2):
...             func(*args, **kwargs)
...     return wrapper
... 
>>> def repeat3(func):
...     def wrapper(*args, **kwargs):
...         for i in range(3):
...             func(*args, **kwargs)
...     return wrapper
... 
>>> def brackets(func):
...     def wrapper(*args, **kwargs):
...         tup = tuple('[' + str(i) + ']' for i in args)
...         return func(*tup, **kwargs)
...     return wrapper
... 
>>> @brackets
... @brackets
... @repeat2
... @repeat2
... @repeat3
... def speak(line):
...     print(line)
... 
>>> speak("Пожалуй это строка")
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
>>>



Офлайн

#3 Дек. 6, 2015 07:45:10

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Офлайн

#4 Дек. 6, 2015 12:06:01

technobot
Зарегистрирован: 2015-11-29
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Декораторы

Вроде бы разобрался, спасибо

Офлайн

#5 Дек. 8, 2015 13:07:09

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Декораторы

Разобраться с декораторами мне помогла вот эта…

ayb
Серия статей про декораторы
+
эта статья

Отредактировано TitanFighter (Дек. 8, 2015 13:08:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version