It took some time to figure out what is behind *args and **kwargs. Finally, I understood it and now I want to share it with you all here. First of all, you need to know what you need to understand. Here is the asterisk (*), not the “args” and “kwargs”. So, if you write def foo(*params, **oparams) and def foo(*args, **kwargs), they both will behave similarly.
- Understand Using Single Asterisk(*)
Single asterisk* is used to pass varied length of arguments. Here is an example on how to use *,
- def foo(a, *b):
- def foo(a, *b):
- print "normal variable: ", a
- print "first argument: ", b[0]
- print "second argument: ", b[1]
- print "third argument: ", b[2]
- foo('amit singh', 1,2,3,4,5)
In this example, “a” is single variable while “b” is varied length of argument. Thus, the first argument will be passed to “a” where the next variable will be passed to “b”. Thus, all arguments (1,2,3,4,5) will be passed to “b” while only “amit singh” will be passed to “a”.
- Understand Using Double Asterisks(**)
Double asterisk (**) is used for varied argument with key. Here is an example.
- def foo(a, **c):
- print "normal variable: ", a
- print "first argument: ", c['one']
- print "second argument: ", c['two']
- print "third argument: ", c['three']
- foo('amit singh', one=1, two=2, three=3)
In this example, the first argument is passed to “a”, while next variable will be passed to “c”. Please notice that the way we pass the variable is different with single asterisk(*). For two asterisks (**), we need to define key for each value we pass. Note that the key is “one”, “two” and “three” while the values are everything after “=”. The number of argument passed may be varied.
- Understand Using Both Single Asterisk(*) And Double Asterisks(**)
To make everything even more clear, here is another example to combine both single asterisk and double asterisks.
- def foo(a, *b, **c):
- print "normal variable: ", a
- print "arg 0: ", b[0]
- print "arg 1: ", b[1]
- print "arg 2: ", b[2]
- print "first argument: ", c['one']
- print "second argument: ", c['two']
- print "third argument: ", c['three']
- foo('amit singh', 1, 2, 3, 4, one=1, two=2, three=3)
Hope this article has made you understand what *args and **kwargs are and when to to use this.