On 18Nov2019 19:09, Samuel Muldoon
At present, multi-argument function decorators are a little bit tricky to implement.
Aye, but one can write a decorator for decorators which makes it easy.
No extra syntax required.
I've one of my own called @decorator, available on PyPI from the
"cs.deco" module. Use:
from cs.deco import decorator
@decorator
def wait(func, delay=1.0):
def wrapped(*a, **kw):
if delay > 0:
time.sleep(delay)
return func(*a, **kw)
return wrapped
and I can then use this as:
@wait
def print_something(something):
print(something)
@wait(delay=0.2)
def print_something_else(something):
print(something)
as you desire.
So any multiargument decorator I write such as the above I write as
though it is unconditionally handed the function to wrap and the
parameters of the decorator, and the @decorator decorator produces an
outer decorator with the special logic you describe.
I'm arguing here that (a) you could just grab my @decorator (and I'm
sure there are other equivalent ones in PyPI) and (b) you don't need
extra syntax.
Of course, you could legitamtely argue that the above should be part of
the protocol which @ implements, and that any sufficiently flexible
decorator should expect a **kw. I'd support that. Again, no new syntax
required, just better behaviour!
Cheers,
Cameron Simpson