Python Variable Arguments
by yaobin.wen
I learned the *args and **kwargs several times but never really remember them so this time I’ll take the note in my blog.
Say that we have a Python script defined as follows:
def func1(*args, **kwargs):
print ">>> args:"
print args
print args.__class__
print ">>> kwargs:"
print kwargs
print kwargs.__class__
func1(10, "a", {}, robin="robin", sarah="sarah")
The following table summarizes what they are:
| Argument | Type | Value |
|---|---|---|
| args | tuple | (10, ‘a’, {}) |
| kwargs | dict | {‘sarah’: ‘sarah’, ‘robin’: ‘robin’} |
Say if we have another function that accepts variable positional arguments and keyword arguments:
def func2(*args, **kwargs):
print "=== args:"
print args
print args.__class__
print "=== kwargs:"
print kwargs
print kwargs.__class__
If we want to call func2 from func1, we can’t simply call like below
func2(args, kwargs)
because args and kwargs will be considered as two positional arguments so in func2’s args will be a tuple that has func1’s args and kwargs and func2’s kwargs will be just an empty dict.
Instead, use the * and ** to unpack the args and kwargs before passing into func2:
func2(*args, **kwargs)
Then in func2, args and kwargs will have the same values as in func1.