Декоратор - это просто функция, которая принимает функцию в качестве параметра и возвращает другую функцию. Декоратор, который принимает аргументы (например, flask route
decorator), должен возвращать функцию, которую можно использовать как простой декоратор.
Например, мы могли бы написать этот route
decorator следующим образом:
routes = {}
def route(path):
def inner(func):
global routes
routes[path] = func
return func
return inner
Вызов route('/')
возвращает функцию, которая принимает функцию в качестве аргумента, которая обновляет глобальную переменную routes
, используя значение path
, переданное внешней функции, и значение func
Получено внутренней функцией.
Если мы используем это для пары функций:
@route('/')
def func1():
...
@route('/example')
def func2():
...
Затем мы можем проверить переменную routes
и увидеть, что теперь она отображает пути к соответствующим функции. Запуск:
print(routes)
Создает что-то вроде:
{'/': <function func1 at 0x7f0c4aeac050>, '/example': <function func2 at 0x7f0c4aeb1e60>}