Using **kwargs
in function definition, you get keyword arguments (not positional arguments) as a dictionary:
>>> def lt_dec(func):
... def _lt_lower(**kwargs):
... print 'type(kwargs)=', type(kwargs)
... print 'kwargs=', kwargs
... kwargs['lane_type'] = kwargs['lane_type'].lower()
... return func(**kwargs)
... return _lt_lower
...
>>> @lt_dec
... def test1(lane_type):
... print lane_type
...
>>> test1(lane_type='Solid')
type(kwargs)= <type 'dict'>
kwargs= {'lane_type': 'Solid'}
solid
>>> def lt_dec(func):
... def _lt_lower(*args, **kwargs):
... if args:
... args = (args[0].lower(),) + args[1:]
... elif 'lane_type' in kwargs:
... kwargs['lane_type'] = kwargs['lane_type'].lower()
... return func(*args, **kwargs)
... return _lt_lower
...
>>> @lt_dec
... def test1(lane_type):
... print lane_type
...
>>> test1('Solid')
solid
>>> test1(lane_type='Solid')
solid
UPDATE
Using inspect.getcallargs
:
>>> import inspect
>>>
>>> def lt_dec(func):
... def _lt_lower(*args, **kwargs):
... kwargs = inspect.getcallargs(func, *args, **kwargs)
... if 'lane_type' in kwargs:
... kwargs['lane_type'] = kwargs['lane_type'].lower()
... return func(**kwargs)
... return _lt_lower
...
>>> @lt_dec
... def test1(blah, lane_type):
... print lane_type
...
>>> test1('foo', 'Solid')
solid
>>> test1('foo', lane_type='Solid')
solid