我有一个模块,它的函数原型与线程类的原型类似。
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__
方法返回函数调用,但我不确定如何传递这样的参数的语法。
这有道理吗?
装饰器所做的是将函数作为参数,并返回一个函数,通常是在装饰器中创建的新函数。
该新函数需要采用与您装饰的函数相同的参数,并且还需要调用原始函数。
现在,当你有一个带有参数的装饰器时,就会发生一个额外的级别。该装饰器应该接受参数,并且返回一个装饰器。你使用的函数实际上不是装饰器,而是装饰器制造者!
这是一个例子:
>>> 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]
您将看到这些装饰器制造商作为类实现的示例。我也很喜欢它(尽管我通常最终根本没有装饰器),但是函数中的函数可以工作。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)