DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on

*args & **kwargs in Python function

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 ** for dictionary unpacking.

You can use *args and **kwargs in a function as shown below:
*The memos for *arg:

  • A *args can store zero or more values as a tuple.
  • Only one *args can be used in a function.
  • A *args cannot have a default value.
  • *args can be other names such as *myargs and *myparam. *A * is an iterable unpacking operator.
  • Zero or more *iterables can be used as the arguments passed to the zero or more parameters including a *args and **kwargs in a function.

*The memos for **kwargs:

  • A **kwargs can store zero or more values as a dictionary.
  • Only one **kwargs can be used in a function.
  • A **kwargs cannot have a default value.
  • A **kwargs must be the last parameter.
  • **kwargs can be other names such as **mykwargs and **myparam. *A ** is a dictionary unpacking operator.
  • Zero or more **dictionaries can be used as the arguments passed to the zero or more parameters including a *args and **kwargs in a function.
def func(*args, **kwargs): pass
def func(p, *args, **kwargs): pass
def func(p="p", *args, **kwargs): pass
def func(*args, p, **kwargs): pass
def func(*args, p="p", **kwargs): pass
# No error

def func(*args1, *args2, **kwargs): pass
# SyntaxError: * argument may appear only once

def func(*args, **kwargs1, **kwargs2): pass
def func(**kwargs, *args): pass
# SyntaxError: arguments cannot follow var-keyword argument

def func(*args=["John"], **kwargs): pass
def func(*args=*["John"], **kwargs): pass
def func(*args, **kwargs={"name":"John"}): pass
def func(*args, **kwargs=**{"name":"John"}): pass
# SyntaxError: var-positional argument cannot have default value
Enter fullscreen mode Exit fullscreen mode
def func(*args, **kwargs):
    print(args, kwargs)
    print(*args, *kwargs)
    print(*kwargs.keys(), *kwargs.values(), *kwargs.items())

func()
# () {}
# Nothing Nothing
# Nothing Nothing Nothing

func(0, 1, 2)
func(*[0, 1, 2])
func(*(0, 1, 2))
# (0, 1, 2) {}
# 0 1 2 Nothing
# Nothing Nothing Nothing

func([0, 1, 2])
# ([0, 1, 2],) {}
# [0, 1, 2] Nothing
# Nothing Nothing Nothing

func((0, 1, 2))
# ((0, 1, 2),) {}
# (0, 1, 2) Nothing
# Nothing Nothing 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'}
# Nothing fname lname
# fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func(*{"fname":"John", "lname":"Smith"})
func(*{"fname":"John"}, *{"lname":"Smith"})
# ('fname', 'lname') {}
# fname lname Nothing
# Nothing Nothing Nothing

func(*{"fname":"John"}, lname="Smith")
# ('fname',) {'lname': 'Smith'}
# fname lname
# lname Smith ('lname', 'Smith')

func(fname="John", *{"lname":"Smith"})
# ('lname',) {'fname': 'John'}
# lname fname
# fname John ('fname', 'John')

func({"fname":"John", "lname":"Smith"})
func({"fname":"John"}, {"lname":"Smith"})
# ({'fname': 'John', 'lname': 'Smith'},) {}
# {'fname': 'John', 'lname': 'Smith'} Nothing
# Nothing Nothing Nothing

func({"fname":"John"}, lname="Smith")
# ({'fname': 'John'},) {'lname': 'Smith'}
# {'fname': 'John'} lname
# lname Smith ('lname', 'Smith')

func(0, 1, 2, fname="John", lname="Smith")
func(*[0, 1, 2], **{"fname":"John", "lname":"Smith"})
func(*(0, 1, 2), **{"fname":"John"}, **{"lname":"Smith"})
# (0, 1, 2) {'fname': 'John', 'lname': 'Smith'}
# 0 1 2 fname lname
# fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func([0, 1, 2], **{"fname":"John"}, lname="Smith")
# ([0, 1, 2],) {'fname': 'John', 'lname': 'Smith'}
# [0, 1, 2] fname lname
# fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func((0, 1, 2), fname="John", **{"lname":"Smith"})
# ((0, 1, 2),) {'fname': 'John', 'lname': 'Smith'}
# (0, 1, 2) fname lname
# fname lname John Smith ('fname', 'John') ('lname', 'Smith')
Enter fullscreen mode Exit fullscreen mode
def func(p="p", *args, **kwargs):
    print(p, args, kwargs)
    print(p, *args, *kwargs)
    print(p,*kwargs.keys(), *kwargs.values(), *kwargs.items())

func()
# p () {}
# p Nothing Nothing
# p Nothing Nothing Nothing

func(0, 1, 2)
func(*[0, 1, 2])
func(*(0, 1, 2))
# 0 (1, 2) {} Nothing
# 0 1 2 Nothing
# 0 Nothing Nothing Nothing

func([0, 1, 2])
# [0, 1, 2] () {}
# [0, 1, 2] Nothing Nothing
# 0 Nothing Nothing Nothing

func((0, 1, 2))
# (0, 1, 2) () {}
# (0, 1, 2) Nothing Nothing
# (0, 1, 2) Nothing Nothing 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"})
# p () {'fname': 'John', 'lname': 'Smith'}
# p Nothing fname lname
# p fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func(*{"fname":"John", "lname":"Smith"})
func(*{"fname":"John"}, *{"lname":"Smith"})
# fname ('lname',) {}
# fname lname Nothing Nothing
# fname Nothing Nothing Nothing

func(*{"fname":"John"}, lname="Smith")
# fname () {'lname': 'Smith'}
# fname Nothing lname
# fname lname Smith ('lname', 'Smith')

func(fname="John", *{"lname":"Smith"})
# lname () {'fname': 'John'}
# lname Nothing fname
# lname fname John ('fname', 'John')

func({"fname":"John", "lname":"Smith"})
# {'fname': 'John', 'lname': 'Smith'} () {}
# {'fname': 'John', 'lname': 'Smith'} Nothing Nothing
# {'fname': 'John', 'lname': 'Smith'} Nothing Nothing Nothing

func({"fname":"John"}, {"lname":"Smith"})
# {'fname': 'John'} ({'lname': 'Smith'},) {}
# {'fname': 'John'} {'lname': 'Smith'} Nothing
# {'fname': 'John'} Nothing Nothing Nothing

func({"fname":"John"}, lname="Smith")
# {'fname': 'John'} () {'lname': 'Smith'}
# {'fname': 'John'} Nothing lname
# {'fname': 'John'} lname Smith ('lname', 'Smith')

func(0, 1, 2, fname="John", lname="Smith")
func(*[0, 1, 2], **{"fname":"John", "lname":"Smith"})
func(*(0, 1, 2), **{"fname":"John"}, **{"lname":"Smith"})
# 0 (1, 2) {'fname': 'John', 'lname': 'Smith'}
# 0 1 2 fname lname
# 0 fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func([0, 1, 2], **{"fname":"John"}, lname="Smith")
# [0, 1, 2] () {'fname': 'John', 'lname': 'Smith'}
# [0, 1, 2] Nothing fname lname
# [0, 1, 2] fname lname John Smith ('fname', 'John') ('lname', 'Smith')

func((0, 1, 2), fname="John", **{"lname":"Smith"})
# (0, 1, 2) () {'fname': 'John', 'lname': 'Smith'}
# (0, 1, 2) Nothing fname lname
# (0, 1, 2) fname lname John Smith ('fname', 'John') ('lname', 'Smith')
Enter fullscreen mode Exit fullscreen mode

Top comments (0)