python-3.x flask 装饰工

0yycz8jy  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(116)

在Flask服务中,我定义了一个装饰器,希望可以用来记录一些信息,然后通过获取所有装饰器记录的信息。那我怎么把所有的装饰
我的需求是通过@xxx记录一些函数信息,方式类似于Swagger,比如@decorator('auther','time','effect')我以前一直不明白decorator和annotation的区别,刚才突然意识到decorator更多的是扩展。它们将劫持对装饰函数的调用,然后添加装饰器所指向的逻辑。以上是我对装饰师的理解,不知道是否正确。现在我想获得装修师记录的所有信息,可行吗?

siotufzp

siotufzp1#

在Python中,装饰器只是一个函数,它将装饰的函数作为参数。解释器将把修饰后的函数传递给装饰器,并将返回值设置回修饰后的函数。
用一个例子可以最好地说明这一点。

def my_decorator(function):
    print('Decorated function:', function)
    return function

@my_decorator
def function(a):
    return a + 1

相当于:

def my_decorator(function):
    print('Decorated function:', function)
    return function

def function(a):
    return a + 1

function = my_decorator(function)

上面是装饰器的简单用法,其中不需要参数。然而,当您需要向装饰器传递参数时,事情就变得有点混乱了。举个例子:

def print_when_decorated(data):
    def actual_decorator(function):
        print('The actual decorator is called, the data is', data)
        return function
    return actual_decorator

@print_when_decorated('hello world')
def my_function():
    return 12345

在这种情况下,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
因此,在本例中,您可以将必要的数据存储在函数对象的属性中。举例来说:

def decorator(author, time, effect):
    def actual_decorator(function):
        function.__my_decorator_data__ = (author, time, effect)
        return function
    return actual_decorator

这在函数上定义了一个属性__my_decorator_data__,它只是一个Python对象。(属性名称无关紧要;你可以给它起任何你喜欢的名字,只要它不与现有的属性冲突。)因为Python对象不像Java对象(例如),所有的字段都必须定义,你可以在任何时候在 most 对象(例如函数)上设置属性。
然后要从函数中获取数据,只需检索前面设置的属性:

# Suppose `function` is decorated with `@decorator('abc', 'def', 'ghi')`
function.__my_decorator_data__  # returns ('abc', 'def', 'ghi')
p1tboqfb

p1tboqfb2#

def decorator(author, time, effect):
    def actual_decorator(function):
        function.__my_decorator_data__ = (author, time, effect)
        return function
    return actual_decorator
    
@decorator(author="John Doe", time="2023-10-12", effect="This is a decorated function")
def my_function():
    print("1234,This is a decorated function")
    pass
        
decorator_data = my_function.__my_decorator_data_
    
if decorator_data:
    author, time, effect = decorator_data
    print(f"Author: {author}")
    print(f"Time: {time}")
    print(f"Effect: {effect}")
else:
    print("Decorator data not found")

相关问题