是否可以在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
所以,我在 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