Is there a simpler way to modify all arguments in a function before using the arguments?

Emile van Sebille emile at fenx.com
Fri Nov 16 01:03:27 CET 2012


brucegoodstein at gmail.com wrote:

> Using a decorator works when named arguments are not used. When named arguments are used, unexpected keyword error is reported. Is there a simple fix?

Extend def wrapper(*args) to handle *kwargs as well

Emile

> Code:
> -----
> 
> from functools import wraps
> 
> def fix_args(fn):
>     @wraps(fn)
>     def wrapper(*args):
>         args = (arg.replace('_', '') for arg in args)
>         return fn(*args)
>     return wrapper
>     
> @fix_args
> def foo(a1="", a2="", b1="", b2=""):
>      print(a1)
>      print(a2) 
>      print(b1)
>      print(b2) 
>      
> foo ('a1a1_x', 'a2a2_x', 'b1b1_x', 'b2b2_____x')
> foo (a1='a1a1_x', a2='a2a2_x', b1='b1b1_x', b2='b2b2_____x')
> 
> Results:
> --------
> a1a1x
> a2a2x
> b1b1x
> b2b2x
> Traceback (most recent call last):
>   File "C:\WORK\masterDB_Update\argtest.py", line 19, in <module>
>     foo (a1='a1a1_x', a2='a2a2_x', b1='b1b1_x', b2='b2b2_____x')
> TypeError: wrapper() got an unexpected keyword argument 'a1'



More information about the Python-list mailing list