【问题标题】:Is it possible to dynamically set the name of a decorator in python?是否可以在python中动态设置装饰器的名称?
【发布时间】:2020-08-16 18:44:26
【问题描述】:

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

from flask import Flask 

something = Flask(__name__)

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

【问题讨论】:

  • 装饰器是something。装饰器只是一个函数(或可调用的)。它是一个类似于intlist 的对象,可以分配给任何变量名。

标签: python flask decorator web-frameworks


【解决方案1】:

装饰器只是一个语法糖:

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)

无论如何,这就是在烧瓶中实现的方式

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2021-04-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多