Найти - Пользователи
Полная версия: Декораторы
Начало » Python для новичков » Декораторы
1
technobot
Думаю задам не один вопрос по юзанию декораторов поскольку толком ни черта не понимаю(

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

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. Зачем вообще нужны декораторы?
Разъясните пожалуйста
py.user.next
Вот с декоратором
>>> 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("Пожалуй это строка")
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
[[Пожалуй это строка]]
>>>
technobot
Вроде бы разобрался, спасибо
TitanFighter
Разобраться с декораторами мне помогла вот эта…
ayb
Серия статей про декораторы
+
эта статья
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB