decorator defaults

155 days ago by jason3

def decorator_defaults(func): from functools import wraps from inspect import isfunction @wraps(func) def my_wrap(*args,**kwargs): if len(kwargs)==0 and len(args)==1 and isfunction(args[0]): # call without parentheses return func(*args) else: def _(f): return func(f, *args, **kwargs) return _ return my_wrap 
       

Now we just decorate or decorators with decorator_defaults.

@decorator_defaults def my_decorator(f,*args,**kwds): print args print kwds print f.__name__ return f 
       
@my_decorator def my_fun(a,b): return a,b 
       
()
{}
my_fun
()
{}
my_fun
@my_decorator(3,4,c=1,d=2) def my_fun(a,b): return a,b 
       
(3, 4)
{'c': 1, 'd': 2}
my_fun
(3, 4)
{'c': 1, 'd': 2}
my_fun

Note that we can also supply specific arguments and defaults as well.

@decorator_defaults def my_decorator2(f, param1=None, param2=3): print param1, param2 return f 
       
@my_decorator2 def my_fun(a,b): return a,b 
       
None 3
None 3
@my_decorator2(param1=4) def my_fun(a,b): return a,b 
       
4 3
4 3