Back to results for “Functions & Scope”
Python › Functions & Scope

How do *args and **kwargs let a function accept an arbitrary number of positional and keyword arguments?

Intermediate

Answer

*args collects any extra POSITIONAL arguments into a tuple; **kwargs collects any extra KEYWORD arguments into a dict — letting a function accept a flexible, variable number of arguments beyond its explicitly named parameters, commonly used for wrapper functions or highly generic APIs.
def flexible_function(required, *args, **kwargs):
    print(f"required={required}")
    print(f"args={args}")
    print(f"kwargs={kwargs}")

flexible_function(1, 2, 3, name="Sam", age=30)
# required=1, args=(2, 3), kwargs={'name': 'Sam', 'age': 30}
Real-world example Writing a generic wrapper or decorator function that needs to forward ANY arguments through to the wrapped function unchanged.

Common follow-ups: How do you UNPACK a list and dict back into a function call using * and ** at the CALL site, the reverse operation?