`**` dictionary unpacking in Python
Buy Me a Coffee☕ *Memos: My post explains variable assignment. My post explains parameters and arguments. My post explains iterable unpacking in variable assignment. My post explains * for iterable unpacking in variable assignment. My post explains * for iterable unpacking in function. My post explains *args and **kwargs in function. You can use ** for dictionary unpacking as shown below: *Memos: ** is a dictionary unpacking operator. Zero or more **dictionaries can be used in a dictionary and as the arguments passed to the zero or more parameters including a *parameter(*args) and **parameter(**kwargs) in a function: *Memos: A **parameter can store zero or more values as a dictionary. A **parameter is a var-keyword parameter. A function can have only one **parameter which is **kwargs conventionally. A **parameter cannot have a default value. A **parameter must be the last parameter. **variable cannot be used in the iterable unpacking of variable assignment. v1 = {"fname":"John", "lname":"Smith"} v2 = {"age":36, "gender":"Male"} v3 = {**v1, **v2} print(v3) # {'fname': 'John', 'lname': 'Smith', 'age': 36, 'gender': 'Male'} print(**{}) # Nothing print(**v3) print(**{'fname': 'John'}, lname='Smith') print(fname='John', **{'lname': 'Smith'}) print(**{'fname':'John'}, **{'lname': 'Smith'}) print(**{'fname': 'John', 'lname': 'Smith'}) # TypeError: 'fname' is an invalid keyword argument for print() print(**[0, 1, 2]) print(**(0, 1, 2)) print(**[]) print(**()) # TypeError: print() argument after ** must be a mapping, not list **v1, = {"fname":"John", "lname":"Smith"} **v1, = *{"fname":"John", "lname":"Smith"} **v1, = **{"fname":"John", "lname":"Smith"} v1, = **{"fname":"John", "lname":"Smith"} *v1, = **{"fname":"John", "lname":"Smith"} # SyntaxError: invalid syntax def func(**kwargs): pass def func(**mydict): pass def func(p, **kwargs): pass def func(p="param", **kwargs): pass def func(*args, **kwargs): pass def func(p, *args, **kwargs): pass def func(p="param", *args, **kwargs): pass def func(*args, p, **kwargs): pass def func(*args, p="param", **kwargs): pass # No error def func(**kwargs1, **kwargs2): pass def func(**kwargs, p): pass def func(**kwargs, p="param"): pass def func(**kwargs, *args): pass # SyntaxError: arguments cannot follow var-keyword argument def func(**kwargs={"name":"John"}): pass def func(**kwargs=**{"name":"John"}): pass # SyntaxError: var-keyword argument cannot have default value def func(**kwargs): print(kwargs, *kwargs) func() func(*{}) func(**{}) func(*[]) func(*()) # {} Nothing func(fname="John", lname="Smith") func(**{"fname":"John", "lname":"Smith"}) func(**{"fname":"John"}, **{"lname":"Smith"}) func(**{"fname":"John"}, lname="Smith") func(fname="John", **{"lname":"Smith"}) # {'fname': 'John', 'lname': 'Smith'} fname lname func({"fname":"John", "lname":"Smith"}) func({"fname":"John"}, lname="Smith") func(*{"fname":"John"}, lname="Smith") func(fname="John", *{"lname":"Smith"}) func([0, 1, 2]) func((0, 1, 2)) func([]) func(()) # TypeError: func() takes 0 positional arguments but 1 was given func(*{"fname":"John", "lname":"Smith"}) func(*{"fname":"John"}, *{"lname":"Smith"}) func({"fname":"John"}, {"lname":"Smith"}) # TypeError: func() takes 0 positional arguments but 2 were given func(*[0, 1, 2]) func(*(0, 1, 2)) # TypeError: func() takes 0 positional arguments but 3 were given def func(**kwargs): print(**kwargs) func() func(**{}) func(*{}) func(*[]) func(*()) # Nothing func(fname="John", lname="Smith") func(**{"fname":"John", "lname":"Smith"}) func(**{"fname":"John"}, lname="Smith") func(fname="John", **{"lname":"Smith"}) # TypeError: 'fname' is an invalid keyword argument for print() func({"fname":"John", "lname":"Smith"}) func({"fname":"John"}, lname="Smith") func(*{"fname":"John"}, lname="Smith") func(fname="John", *{"lname":"Smith"}) func([0, 1, 2]) func((0, 1, 2)) func([]) func(()) # TypeError: func() takes 0 positional arguments but 1 was given func(*{"fname":"John", "lname":"Smith"}) # TypeError: func() takes 0 positional arguments but 2 were given func(*[0, 1, 2]) func(*(0, 1, 2)) # TypeError: func() takes 0 positional arguments but 3 were given def func(p="p", **kwargs): print(p, kwargs) print(*kwargs, *kwargs.keys(), *kwargs.values(), *kwargs.items()) func() # p {} # Nothing Nothing Nothing Nothing func(p="param") func(**{"p":"param"}) # param {} # Nothing Nothing Nothing Nothing func(fname="John", lname="Smith") func(**{"fname":"John", "lname":"Smith"}) func(**{"fname":"John"}, lname="Smith") func(fname="John", **{"lname":"Smith"}) # p {'fname': 'John', 'lname': 'Smith'} # fname lname fname lname John Smith ('fname', 'John') ('lname', 'Smith') func("param", fname="John", lname="Smith") func("param", **{"fname":"John", "lname":"Smith"}) func("param", **{"fname":"John"}, lname="Smith") func("param", fname="John", **{"lname":"Smith"}) func(p="param", fname="John", lname="S

*Memos:
- My post explains variable assignment.
- My post explains parameters and arguments.
- My post explains iterable unpacking in variable assignment.
-
My post explains
*
for iterable unpacking in variable assignment. -
My post explains
*
for iterable unpacking in function. -
My post explains
*args
and**kwargs
in function.
You can use **
for dictionary unpacking as shown below:
*Memos:
-
**
is a dictionary unpacking operator. - Zero or more
**dictionaries
can be used in a dictionary and as the arguments passed to the zero or more parameters including a*parameter
(*args
) and**parameter
(**kwargs
) in a function: *Memos:- A
**parameter
can store zero or more values as a dictionary. - A
**parameter
is a var-keyword parameter. - A function can have only one
**parameter
which is**kwargs
conventionally. - A
**parameter
cannot have a default value. - A
**parameter
must be the last parameter.
- A
-
**variable
cannot be used in the iterable unpacking of variable assignment.
v1 = {"fname":"John", "lname":"Smith"}
v2 = {"age":36, "gender":"Male"}
v3 = {**v1, **v2}
print(v3) # {'fname': 'John', 'lname': 'Smith', 'age': 36, 'gender': 'Male'}
print(**{}) # Nothing
print(**v3)
print(**{'fname': 'John'}, lname='Smith')
print(fname='John', **{'lname': 'Smith'})
print(**{'fname':'John'}, **{'lname': 'Smith'})
print(**{'fname': 'John', 'lname': 'Smith'})
# TypeError: 'fname' is an invalid keyword argument for print()
print(**[0, 1, 2])
print(**(0, 1, 2))
print(**[])
print(**())
# TypeError: print() argument after ** must be a mapping, not list
**v1, = {"fname":"John", "lname":"Smith"}
**v1, = *{"fname":"John", "lname":"Smith"}
**v1, = **{"fname":"John", "lname":"Smith"}
v1, = **{"fname":"John", "lname":"Smith"}
*v1, = **{"fname":"John", "lname":"Smith"}
# SyntaxError: invalid syntax
def func(**kwargs): pass
def func(**mydict): pass
def func(p, **kwargs): pass
def func(p="param", **kwargs): pass
def func(*args, **kwargs): pass
def func(p, *args, **kwargs): pass
def func(p="param", *args, **kwargs): pass
def func(*args, p, **kwargs): pass
def func(*args, p="param", **kwargs): pass
# No error
def func(**kwargs1, **kwargs2): pass
def func(**kwargs, p): pass
def func(**kwargs, p="param"): pass
def func(**kwargs, *args): pass
# SyntaxError: arguments cannot follow var-keyword argument
def func(**kwargs={"name":"John"}): pass
def func(**kwargs=**{"name":"John"}): pass
# SyntaxError: var-keyword argument cannot have default value
def func(**kwargs):
print(kwargs, *kwargs)
func()
func(*{})
func(**{})
func(*[])
func(*())
# {} Nothing
func(fname="John", lname="Smith")
func(**{"fname":"John", "lname":"Smith"})
func(**{"fname":"John"}, **{"lname":"Smith"})
func(**{"fname":"John"}, lname="Smith")
func(fname="John", **{"lname":"Smith"})
# {'fname': 'John', 'lname': 'Smith'} fname lname
func({"fname":"John", "lname":"Smith"})
func({"fname":"John"}, lname="Smith")
func(*{"fname":"John"}, lname="Smith")
func(fname="John", *{"lname":"Smith"})
func([0, 1, 2])
func((0, 1, 2))
func([])
func(())
# TypeError: func() takes 0 positional arguments but 1 was given
func(*{"fname":"John", "lname":"Smith"})
func(*{"fname":"John"}, *{"lname":"Smith"})
func({"fname":"John"}, {"lname":"Smith"})
# TypeError: func() takes 0 positional arguments but 2 were given
func(*[0, 1, 2])
func(*(0, 1, 2))
# TypeError: func() takes 0 positional arguments but 3 were given
def func(**kwargs):
print(**kwargs)
func()
func(**{})
func(*{})
func(*[])
func(*())
# Nothing
func(fname="John", lname="Smith")
func(**{"fname":"John", "lname":"Smith"})
func(**{"fname":"John"}, lname="Smith")
func(fname="John", **{"lname":"Smith"})
# TypeError: 'fname' is an invalid keyword argument for print()
func({"fname":"John", "lname":"Smith"})
func({"fname":"John"}, lname="Smith")
func(*{"fname":"John"}, lname="Smith")
func(fname="John", *{"lname":"Smith"})
func([0, 1, 2])
func((0, 1, 2))
func([])
func(())
# TypeError: func() takes 0 positional arguments but 1 was given
func(*{"fname":"John", "lname":"Smith"})
# TypeError: func() takes 0 positional arguments but 2 were given
func(*[0, 1, 2])
func(*(0, 1, 2))
# TypeError: func() takes 0 positional arguments but 3 were given
def func(p="p", **kwargs):
print(p, kwargs)
print(*kwargs, *kwargs.keys(), *kwargs.values(), *kwargs.items())
func()
# p {}
# Nothing Nothing Nothing Nothing
func(p="param")
func(**{"p":"param"})
# param {}
# Nothing Nothing Nothing Nothing
func(fname="John", lname="Smith")
func(**{"fname":"John", "lname":"Smith"})
func(**{"fname":"John"}, lname="Smith")
func(fname="John", **{"lname":"Smith"})
# p {'fname': 'John', 'lname': 'Smith'}
# fname lname fname lname John Smith ('fname', 'John') ('lname', 'Smith')
func("param", fname="John", lname="Smith")
func("param", **{"fname":"John", "lname":"Smith"})
func("param", **{"fname":"John"}, lname="Smith")
func("param", fname="John", **{"lname":"Smith"})
func(p="param", fname="John", lname="Smith")
func(**{"p":"param", "fname":"John", "lname":"Smith"})
func(**{"p":"param", "fname":"John"}, lname="Smith")
func(p="param", **{"fname":"John", "lname":"Smith"})
func(**{"p":"param"}, fname="John", lname="Smith")
func(p="param", **{"fname":"John"}, lname="Smith")
func(p="param", fname="John", **{"lname":"Smith"})
func(fname="John", lname="Smith", p="param")
func(**{"fname":"John", "lname":"Smith", "p":"param"})
func(**{"fname":"John", "lname":"Smith"}, p="param")
func(fname="John", **{"lname":"Smith", "p":"param"})
func(**{"fname":"John"}, lname="Smith", p="param")
func(fname="John", **{"lname":"Smith"}, p="param")
func(fname="John", lname="Smith", **{"p":"param"})
# param {'fname': 'John', 'lname': 'Smith'}
# fname lname fname lname John Smith ('fname', 'John') ('lname', 'Smith')