[Python-ideas] An easier syntax for writing decorators (& similar things)?

Arnaud Delobelle arno at marooned.org.uk
Mon Oct 8 19:42:33 CEST 2007


On 8 Oct 2007, at 10:57, Arnaud Delobelle wrote:

>
> On Mon, October 8, 2007 4:33 am, Adam Atlas wrote:
>> When writing decorators especially when it's one that needs arguments
>> other than the function to be wrapped, it often gets rather ugly...
[...]
> Whhy not create a (meta-)decorator to do this? Something like:
[...]

To follow up on my untested suggestion, here's one that is tested:

# This metadecorator hasn't changed

def decorator_withargs(decf):
     def decorator(*args, **kwargs):
         def decorated(f):
             return decf(f, *args, **kwargs)
         return decorated
     return decorator


# Here's how to use it to create a decorator

@decorator_withargs
def mydec(f, before='entering %s', after='%s returns %%s'):
     before = before % f.__name__
     after = after % f.__name__
     def decorated(*args, **kwargs):
         print before
         result = f(*args, **kwargs)
         print after % result
         return result
     return decorated


# Now I can decorate a function with my new decorator

@mydec(before='-> %s', after='%s -> %%s')
def f(x):
     print x
     return x+1


Then

 >>> f(1)
-> f
1
f -> 2
2

-- 
Arnaud





More information about the Python-ideas mailing list