`**` 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

May 18, 2025 - 04:14
 0
`**` 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="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')