繁体   English   中英

装饰器函数为什么缺少f参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM