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

问题描述 投票:1回答:1

所以,我在学习python中的FLASK框架,并做了我的第一个简单的程序,默认情况下,我看到人们使用的是 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!"

python flask decorator web-frameworks
1个回答
3
投票

装饰符只是一个语法糖。

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
© www.soinside.com 2019 - 2024. All rights reserved.