["python","python-2.7"]
Default arguments with *args and **kwargs

In Python 2.x (I use 2.7), which is the proper way to use default arguments with *args and **kwargs? I've found a question on SO related to this topic, but that is for Python 3: Calling a Python function with *args,**kwargs and optional / default arguments There, they say this method works: def func(arg1, arg2, *args, opt_arg='def_val', **kwargs): #... In 2.7, it results in a SyntaxError. Is there any recommended way to define such a function? I got it working this way, but I'd guess there is a nicer solution. def func(arg1, arg2, *args, **kwargs): opt_arg ='def_val' if kwargs.__contains__('opt_arg'): opt_arg = kwargs['opt_arg'] #...
Just put the default arguments before the *args: def foo(a, b=3, *args, **kwargs): Now, b will be explicitly set if you pass it as a keyword argument or the second positional argument. Examples: foo(x) # a=x, b=3, args=(), kwargs={} foo(x, y) # a=x, b=y, args=(), kwargs={} foo(x, b=y) # a=x, b=y, args=(), kwargs={} foo(x, y, z, k) # a=x, b=y, args=(z, k), kwargs={} foo(x, c=y, d=k) # a=x, b=3, args=(), kwargs={'c': y, 'd': k} foo(x, c=y, b=z, d=k) # a=x, b=z, args=(), kwargs={'c': y, 'd': k} Note that, in particular, foo(x, y, b=z) doesn't work because b is assigned by position in that case. This code works in Python 3 too. Putting the default arg after *args in Python 3 makes it a "keyword-only" argument that can only be specified by name, not by position. If you want a keyword-only argument in Python 2, you can use @mgilson's solution.