gpt4 book ai didi

带有选项的 Python 装饰器

转载 作者:太空狗 更新时间:2023-10-29 22:02:04 25 4
gpt4 key购买 nike

我有一个模块,它有一个原型(prototype)类似于线程类的函数。

def do(fn, argtuple=(), kwargdict={}, priority=0,
block=False, timeout=0, callback=None, daemon=False)

# do stuff

fn 是可调用对象,argtuple 和 kwargdict 是位置参数和字典参数,将在调用 fn 可调用对象时传递给它。

我现在正在尝试为此编写一个装饰器,但我很困惑。我从来没有真正很好地掌握装饰器。有没有一种方法可以制作一个装饰器,我可以在上面设置超时等选项,但在调用函数时传入 argtuple 和 kwargdict。

例如:

@do(priority=2)
def decoratedTask(arg, dic=3):
#do stuff

decoratedTask(72)

我很困惑如何将运行时参数 72 传递给装饰函数。我认为装饰器需要是 __call__ 方法返回函数调用的类,但我不确定如何传递这样的参数的语法。

这有意义吗?

最佳答案

装饰器所做的是将函数作为参数并返回一个函数,通常是在装饰器中创建的新函数。

那个新函数需要和你装饰的函数有相同的参数,而且它还需要调用原来的函数。

现在,当你有一个带参数的装饰器时,就会有一个额外的层次。该装饰器应该接受参数,并返回一个装饰器。你使用的函数其实不是decorator,而是decoratormaker!

这是一个例子:

>>> def mydeco(count):
... def multipass(fn):
... def caller(*args, **kw):
... return [fn(*args, **kw) for x in range(count)]
... return caller
... return multipass
...
>>> @mydeco(5)
... def printer(text):
... print(text)
...
>>> printer("Yabbadabbadoo!")
Yabbadabbadoo!
Yabbadabbadoo!
Yabbadabbadoo!
Yabbadabbadoo!
Yabbadabbadoo!
[None, None, None, None, None]

您将看到这些装饰器制造商作为类实现的示例。这也是我更喜欢它的方式(尽管我通常最终根本没有装饰器),但是函数中的函数在函数中起作用。 :)

关于带有选项的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4486499/

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