Декоратор создаёт новый объект (обычно функцию), используя в качестве аргумента другую единственную функцию. Однако иногда хочется задать больше, чем одну функцию.



Сделать это напрямую невозможно из-за ограничений синтаксиса Python, но можно использовать небольшой трюк. Возвращаемая функция может содержать ещё один декоратор, который можно повторно применить к дополнительным функциям, добавляя новое поведение. Примерно так работает @property:

@property
def x(self):
return self._x

@x.setter
def x(self, value):
self._x = value


Ниже приведён пример того, как можно определить функцию, которая использует дополнительные функции для особых случаев:

from functools import wraps

def make_case_decorator(func):
def case_decorator(*case_decorator_args):
def decorator(special_case_func):
@wraps(func)
def decorated(*args):
if case_decorator_args == args:
return special_case_func(*args)
return func(*args)

decorated.case = make_case_decorator(decorated)

return decorated

return decorator

return case_decorator


def special_cases(func):
@wraps(func)
def decorated(*args):
return func(*args)

decorated.case = make_case_decorator(decorated)

return decorated


@special_cases
def fact(x):
return x * fact(x - 1)

@fact.case(0)
def fact(x):
return 1

@fact.case(10)
def fact(x):
print(f'(сработала оптимизация для {x})')
return 3628800


👉 @BookPython
Просмотры: 1 767
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти