What are *args and **kwargs in Python
The special syntax *args and **kwargs in function definitions is used to pass a variable number of arguments to a function. Let's break each of them down:
Positional Arguments (*args)
The *args syntax in a function signature is used to pass a variable-length list of positional arguments. The single asterisk (*) before the variable name (args is a naming convention, but you can use any name you want) collects multiple positional arguments into a single tuple.
Here's a simple example:
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # Output: 10
In this example, *args collects the arguments 1, 2, 3, and 4 into a tuple (1, 2, 3, 4), and then the sum function calculates their sum.
Keyword Arguments (**kwargs)
The **kwargs syntax is similar to *args, but instead of collecting positional arguments, it collects keyword (named) arguments into a dictionary. The double asterisks (**) before the variable name (again, kwargs is a naming convention) signal that any extra named arguments passed to the function should be gathered into a dictionary.
Here's an example:
def print_data(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_data(name="Alice", age=30, country="USA")
Output:
name: Alice
age: 30
country: USA
In this example, **kwargs collects the keyword arguments name="Alice", age=30, country="USA" into a dictionary {'name': 'Alice', 'age': 30, 'country': 'USA'}, and then the function iterates through the dictionary to print out the data.
Using *args and **kwargs Together
You can use both *args and **kwargs in a function definition, but *args has to appear before **kwargs.
def func(a, b, *args, keyword1=None, **kwargs):
print(a, b)
print(args)
print(keyword1)
print(kwargs)
func(1, 2, 3, 4, 5, keyword1="hello", keyword2="world")
 OUTPUT:
1 2
(3, 4, 5)
hello
{'keyword2': 'world'}
In this example, a and b are standard positional arguments, *args collects extra positional arguments, keyword1 is a standard keyword argument, and **kwargs collects additional keyword arguments.
Understanding *args and **kwargs is crucial for writing flexible functions that can handle a variety of input, and they're also commonly used in class method overrides, decorators, and other advanced Python features.