*Memo:
- My post explains the unpacking with an assignment statement (1).
- My post explains the unpacking with an assignment statement (2).
-
My post explains the unpacking with a
for
statement (1). -
My post explains the unpacking with a
for
statement (2). -
My post explains the iterable unpacking with
*
and a function (1). -
My post explains the iterable unpacking with
*
and a function (2). -
My post explains the dictionary unpacking with
**
within a dictionary and function. -
My post explains
*args
.
**kwargs
can be used in a function as shown below:
*Memo:
- A
**kwargs
is the dictionary parameter which can flexibly accept zero or more keyward arguments so the type isdict
. - A
**kwargs
is called a var-keyword parameter. - A
**kwargs
is the optional parameter with the immutable default value{}
so the default value{}
cannot be changed with=
. - Only one
**kwargs
can be used in a function definition. - A
**kwargs
must be the last parameter. - A
**kwargs
can be other names like**teachers
,**students
, etc. - One or more
**dictionaries
can be used within a dictionary and as the arguments within a function call excluding print() to unpack them into the one or more parameters including**kwargs
but excluding*args
within a function definition and used within a dictionary to unpack dictionaries:- One or more
**dictionaries
can be used with**kwargs
but not withprint()
and*args
.
- One or more
def func(**kwargs): pass
def func(A, **kwargs): pass
def func(A='B', **kwargs): pass
# No error
def func(**kwargs, **kwargs): pass
# SyntaxError: * argument may appear only once
def func(**kwargs, A): pass
def func(**kwargs, A='B'): pass
# SyntaxError: arguments cannot follow var-keyword argument
def func(**kwargs='ABC'): pass
# SyntaxError: var-keyword argument cannot have default value
<func(**kwargs) with keyword arguments>:
def func(**kwargs):
print(kwargs)
print({0:1, **kwargs, 2:3})
func()
# {}
# {0: 1, 2: 3}
func(A='B', C='D')
func(**{'A':'B', 'C':'D'})
func(**{'A':'B'}, **{'C':'D'})
func(A='B', **{'C':'D'})
func(**{'A':'B'}, C='D')
# {'A': 'B', 'C': 'D'}
# {0: 1, 'A': 'B', 'C': 'D', 2: 3}
<func(A, **kwargs) with keyword arguments>:
def func(A='b', **kwargs):
print(A, kwargs)
print(A, {0:1, **kwargs, 2:3})
func()
# b {}
# b {0: 1, 2: 3}
func(A='B', C='D')
func(**{'A':'B', 'C':'D'})
func(**{'A':'B'}, **{'C':'D'})
func(A='B', **{'C':'D'})
func(**{'A':'B'}, C='D')
# B {'C': 'D'}
# B {0: 1, 'C': 'D', 2: 3}
<func(**kwargs) with positional arguments>:
def func(**kwargs):
print(kwargs)
print(**kwargs)
func()
# {}
# Nothing
func(0, 1, 2, 3, 4, 5)
func(*[0, 1, 2, 3], *[4, 5]) # list
func(*(0, 1, 2, 3), *(4, 5)) # tuple
func(*{0, 1, 2, 3}, *{4, 5}) # set
func(*frozenset({0, 1, 2, 3}), *frozenset({4, 5})) # frozenset
func(0, 2, 4, 6, 8, 10)
func(*{0:1, 2:3, 4:5, 6:7}, *{8:9, 10:11}) # dict
func(*{0:1, 2:3, 4:5, 6:7}.keys(), # dict.keys()
*{8:9, 10:11}.keys())
func(*iter([0, 1, 2, 3]), *iter([4, 5])) # iterator
func(*range(4), *range(4, 6)) # range
func(1, 3, 5, 7, 9, 11)
func(*{0:1, 2:3, 4:5, 6:7}.values(), # dict.values()
*{8:9, 10:11}.values())
func((0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11))
func(*{0:1, 2:3, 4:5, 6:7}.items(), # dict.items()
*{8:9, 10:11}.items())
func('0', '1', '2', '3', '4', '5')
func(*'0123', *'45') # str
func(48, 49, 50, 51, 52, 53)
func(*b'0123', *b'45') # bytes
func(*bytearray(b'0123'), *bytearray(b'45')) # bytearray
func(0, 1, 50, 3, 4, 5)
func(*[0, 1], *b'2', *{3, 4, 5})
# TypeError: func() takes 0 positional arguments but 6 were given
Top comments (0)