Можно ли динамически установить имя декоратора в python? - PullRequest
2 голосов
/ 02 мая 2020

Итак, я изучал фреймворк FLASK в python и создал свою самую первую простую программу, и по умолчанию я видел людей, использующих app = Flask(__name__), и чуть ниже этой строки они используют декоратор @app.route("/"), поэтому Я думал, что произойдет, если я изменю имя переменной на другое? Как и в приведенном ниже коде, я изменил его на something = Flask(__name__), поэтому теперь я озадачен тем, как он все еще работает, когда я декорирую функцию index() с помощью @something.route("/"), это имя функции декоратора, определенной в FLASK меняется динамически? и если да, то как я могу сделать свои собственные декораторы такими, чтобы они тоже меняли свои имена динамически?

from flask import Flask 

something = Flask(__name__)

@something.route("/")
def index():
    return "Hello, World!"

1 Ответ

3 голосов
/ 02 мая 2020

Декоратор - это просто синтаксис c сахар:

def decorator(func):
    pass

@decorator
def decorated():
    pass

- это то же самое, что и:

def decorator(func):
    pass

def decorated():
    pass

decorated = decorator(decorated)

Имя декоратора - не более чем функция, которая принимает один аргумент. Вы даже можете использовать функцию print в качестве декоратора. Любой допустимый вызываемый объект будет делать:

@print
def index():
    pass

Очевидно, что это не имеет большого смысла, потому что:

def index():
    pass

index = print(index)

В любом случае, именно так это можно реализовать в flask

class Flask:
    def route(self, url):
        def wrapper(func):
            # register route for url
            return func

        return wrapper

something = Flask()

@something.route("/")
def index():
    pass

something.route("/") - это вызов функции, который возвращает реальный декоратор, который на самом деле является внутренней функцией с именем wrapper.

Так что вы даже можете сделать что-то вроде этого:

something_route_index = something.route("/")

@something_route_index
def index():
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...