SpecialistOff.NET / Вопросы / Статьи / Фрагменты кода / Резюме / Метки / Помощь / Файлы

Назад

Декораторы в Python


Метки: python

Основы декораторов

Примитив

def decorator(func):
return func

def basic():
return 'SpecialistOff.NET'

callable = decorator(basic)

callable()

Синтаксический сахар

def decorator(func):
return func

@decorator
def basic():
return 'SpecialistOff.NET'

basic()

Изменение поведения

def is_error(func):
def wrapper(numerator, denominator):
assert denominator!=0, 'Ошибка деления на нуль'
return func(numerator, denominator)
return wrapper

@is_error
def quotient(numerator, denominator):
return numerator / denominator

quotient(1, 0)

Декораторы с аргументами

class Broker:
    def __init__(self):
        self.__routes = {}

    def __call__(self, name, *args, **kwargs):
        assert name in self.__routes, 'Путь не найден'
        func = self.__routes[name]
        return func(*args, **kwargs)

    def route(self, name):
        def wrapper(func):
            self.__routes[name] = func
        return wrapper

broker = Broker()
@broker.route('/') def index(): return 'Index'
@broker.route('/about') def about(): return 'About' result = broker('/') print(result)