![](/img/trans.png)
[英]Can you use a decorator to add an additional parameter to the inner function?
[英]why can the decorator function lack the f parameter?
更新:
class Flask():
def route(self,rule,**options):#why here doesn't exist a paramter to receive the decorated function?
def wrapper(f):
endpoint = options.pop('endpoint',None)
self.add_url_rule(rule,endpoint,f,**option)
return f
return wrapper
@app.route('/grade',methods=['post'])
def example():
pass
为什么route函数没有参数来接收修饰的函数-示例
就像典型示例在python中使用装饰器所做的一样
def my_decorator(f):# the my_decorator function has got a parameter to receive the decorated function
def wrapper(*args, **kwds):
print('Calling decorated function')
return f(*args, **kwds)
return wrapper
@my_decorator
def example():
"""Docstring"""
print('Called example function')
这可能不是一个幼稚的概念,但是要使用参数构建装饰器,则需要对生成装饰器的装饰器进行编码。 为了让您到达那里,让我花几句话。
对于简单的装饰器,通常按照报告的方式进行:
def decorator(function):
def wrapper(*args, **kwargs):
print("bar")
function(*args, **kwargs)
return wrapper
@decorator
def foo(word):
print(word)
foo('boo')
结果
"bar"
"boo"
其中foo
在包装器中作为变量function
的“值”执行,该function
通过注释@decorator
本身分配-无输入。
鉴于此,如果您还想要装饰器输入,则需要发出另一个级别,捕获输入并将其包装到闭包中-这是装饰器的实际声明,包装了函数。 这就是烧瓶代码中发生的情况。
def decorator_factory(*a, **kw):
def decorator(function):
def wrapper(*args, **kwargs):
print(a[0])
function(*args, **kwargs)
return wrapper
return decorator
@decorator_factory('bar')
def foo(word):
print(word)
foo('boo')
结果再次
"bar"
"boo"
接收装饰后的功能的不是Flask.route
函数,而是一个称为decorator
函数。 这样,您可以通过额外的函数调用将路由规则提供给装饰器。 如果仔细观察,您会发现您的“典型装饰器”示例在多个地方都被打乱了,因此是一个错误的示例。 修复编译错误后,它给出以下运行时错误:
def decorator(func):
def wrapper():
x = func()
return x
return wrapper
@decorator()
def balabala():
pass
...
TypeError: decorator() missing 1 required positional argument: 'func'
这是因为您不带参数地调用它。
用这种方法定义的修饰符并不意味着要用括号使用,正确的方法是:
@decorator # no brackets here
def balabala():
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.