gpt4 book ai didi

Python 动态装饰器——为什么有这么多包装?

转载 作者:太空狗 更新时间:2023-10-29 17:23:45 25 4
gpt4 key购买 nike

所以我对 Python 装饰器还是有点陌生​​——我以前用过它们,但我从未制作过自己的装饰器。我正在阅读 this tutorial (那个特定的段落)我似乎不明白为什么我们需要三层功能?为什么我们不能这样做:

def decorator(func, *args, **kwargs):
return func(*args,**kwargs)

谢谢:)

最佳答案

好吧,如果你在一个函数上调用那个装饰器会发生什么?

@decorator
def foo(): pass

这段代码会立即调用 foo,这是我们不希望的。装饰器被调用并且它们的返回值替换函数。这和说是一样的

def foo(): pass
foo = decorator(foo)

因此,如果我们有一个调用 foo 的装饰器,我们可能希望有一个函数返回一个调用 foo 的函数——它返回的那个函数将替换 foo。

def decorator(f):
def g(*args, **kwargs):
return f(*args, **kwargs)
return g

现在,如果我们想将选项传递给装饰器,我们不能像您的示例中那样将它们与函数并排传递。没有语法。所以我们定义了一个返回参数化装饰器的函数。它返回的装饰器将是一个闭包。

def argument_decorator(will_I_call_f):
def decorator(f):
def g(*args, **kwargs):
if will_I_call_f: return f(*args, **kwargs)
return g
return decorator

所以我们可以做

decorator = argument_decorator(True)
@decorator
def foo(): pass

Python 提供了方便的语法,您可以在其中内联函数调用:

@argument_decorator(True)
def foo(): pass

所有这些都是非装饰器语法的语法糖

def foo(): pass
foo = argument_decorator(True)(foo)

关于Python 动态装饰器——为什么有这么多包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com