Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2017 17:13:15

fshshsh
Зарегистрирован: 2015-10-08
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

[ДЕКОРАТОРЫ] Зачем внутри делать "обертку"?

Примеры:
1.

 def say_hello():
    print('Hello')
def do_thmth(function):
    def wrap():
        print('Сказал:')
        function()
        print('Улыбнулся')
    return wrap
do_thmth(say_hello)

2.
 def operator(op):
    def sum (first = 5, second = 5):
        return sum
    def minus (first = 5, second = 2):
        return minus
    if (op == '+'):
        return sum
    else: 
        return minus

Последовательность:
1. Вызываем функцию, передав какой-либо аргумент (другую функцию, символ, число - не важно).
2. Получили адрес функции, в которую нужно передать конкретные параметры (в примере 2 - числа для мат. операции).

Правильно ли я понял, что если шаг 2 не нужен (не нужно передавать аргументы), то декорировать не нужно? Т.е. декорирование в примере 1 излишне? В примере 2 еще понимаю смысл декораторов - чтобы внутрь логику спрятать.

Отредактировано fshshsh (Май 12, 2017 18:33:04)

Офлайн

#2 Май 12, 2017 21:00:08

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

[ДЕКОРАТОРЫ] Зачем внутри делать "обертку"?

Неправильно. Декорирование может вообще поменять функцию при определенных внешних факторах. Или дополнительно дописать что-то куда-то. Например, в лог.

P.S. Вот вам задание на понимание. Написать декоратор, который будет писать в какой-нибудь файл время вызова функции и ее имя.

Офлайн

#3 Май 13, 2017 04:16:36

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

[ДЕКОРАТОРЫ] Зачем внутри делать "обертку"?

fshshsh
Правильно ли я понял, что если шаг 2 не нужен (не нужно передавать аргументы), то декорировать не нужно?
У тебя есть функция, ты её передаёшь в декоратор, а из декоратора возвращается новая функция. (Вообще, декоратор - это шаблон ООП.) Вот когда функция вернулась из декоратора, она встаёт на место старой функции. И когда ты пользуешься старой функцией, на самом деле вызывается продекорированная.

Пример применения декоратора к функции:
  
>>> def silent_dec(func):
...     def wrapper():
...         return 'nothing'
...     return wrapper
... 
>>> def hello():
...     return 'hello'
... 
>>> 
>>> hello()
'hello'
>>>

  
>>> def silent_dec(func):
...     def wrapper():
...         return 'nothing'
...     return wrapper
... 
>>> @silent_dec
... def hello():
...     return 'hello'
... 
>>> 
>>> hello()
'nothing'
>>>



Отредактировано py.user.next (Май 13, 2017 04:22:03)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version