在Flask服务中,我定义了一个装饰器,希望可以用来记录一些信息,然后通过获取所有装饰器记录的信息。那我怎么把所有的装饰
我的需求是通过@xxx记录一些函数信息,方式类似于Swagger,比如@decorator('auther','time','effect')我以前一直不明白decorator和annotation的区别,刚才突然意识到decorator更多的是扩展。它们将劫持对装饰函数的调用,然后添加装饰器所指向的逻辑。以上是我对装饰师的理解,不知道是否正确。现在我想获得装修师记录的所有信息,可行吗?
2条答案
按热度按时间siotufzp1#
在Python中,装饰器只是一个函数,它将装饰的函数作为参数。解释器将把修饰后的函数传递给装饰器,并将返回值设置回修饰后的函数。
用一个例子可以最好地说明这一点。
相当于:
上面是装饰器的简单用法,其中不需要参数。然而,当您需要向装饰器传递参数时,事情就变得有点混乱了。举个例子:
在这种情况下,Python将首先调用装饰器(
print_when_decorated
),并将参数'hello world'
传递给data
。然后,在print_when_decorated
函数内部,定义了另一个函数,即actual_decorator
。然后print_when_decorated
返回它。因此,Python将用
print_when_decorated('hello world')
调用的返回值actual_decorator
装饰my_function
。因此,代码将输出The actual decorator is called, the data is hello world
。因此,在本例中,您可以将必要的数据存储在函数对象的属性中。举例来说:
这在函数上定义了一个属性
__my_decorator_data__
,它只是一个Python对象。(属性名称无关紧要;你可以给它起任何你喜欢的名字,只要它不与现有的属性冲突。)因为Python对象不像Java对象(例如),所有的字段都必须定义,你可以在任何时候在 most 对象(例如函数)上设置属性。然后要从函数中获取数据,只需检索前面设置的属性:
p1tboqfb2#