Найти - Пользователи
Полная версия: [ДЕКОРАТОРЫ] Зачем внутри делать "обертку"?
Начало » Python для новичков » [ДЕКОРАТОРЫ] Зачем внутри делать "обертку"?
1
fshshsh
Примеры:
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 еще понимаю смысл декораторов - чтобы внутрь логику спрятать.
4kpt_V
Неправильно. Декорирование может вообще поменять функцию при определенных внешних факторах. Или дополнительно дописать что-то куда-то. Например, в лог.

P.S. Вот вам задание на понимание. Написать декоратор, который будет писать в какой-нибудь файл время вызова функции и ее имя.
py.user.next
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'
>>>
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