是否可以在python中动态设置装饰器的名称?

Is it possible to dynamically set the name of a decorator in python?

所以,我在 python 研究了 FLASK 框架并制作了我的第一个简单程序,默认情况下我看到人们使用 app = Flask(__name__) 并且在该行下方他们使用装饰器 @app.route("/"),所以我想如果我把变量的名字改成别的什么会发生什么?就像在下面的代码中一样,我已将其更改为 something = Flask(__name__) 所以现在我很困惑,当我用 @something.route("/") 装饰函数 index() 时它仍然如何工作,是FLASK 中定义的修饰函数动态变化?如果是这样,我怎样才能像这样制作自己的装饰器,以便它们也能动态更改名称?

from flask import Flask 

something = Flask(__name__)

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

装饰器只是一个语法糖:

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("/") 是一个函数调用,returns 真正的装饰器实际上是名为 wrapper 的内部函数。

所以你甚至可以这样做:

something_route_index = something.route("/")

@something_route_index
def index():
    pass