Understanding *args
and `kwargs` in Python**
In Python, *args
and **kwargs
are used to pass a variable number of arguments to a function.
What is *args
?
-
*args
allows a function to accept any number of positional arguments. - These arguments are collected as a tuple.
Example: Using *args
<span>def</span> <span>add_numbers</span><span>(</span><span>*</span><span>args</span><span>):</span><span>return</span> <span>sum</span><span>(</span><span>args</span><span>)</span><span>print</span><span>(</span><span>add_numbers</span><span>(</span><span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span><span>))</span> <span># Output: 6 </span><span>print</span><span>(</span><span>add_numbers</span><span>(</span><span>10</span><span>,</span> <span>20</span><span>,</span> <span>30</span><span>,</span> <span>40</span><span>))</span> <span># Output: 100 </span><span>print</span><span>(</span><span>add_numbers</span><span>())</span> <span># Output: 0 (No arguments) </span><span>def</span> <span>add_numbers</span><span>(</span><span>*</span><span>args</span><span>):</span> <span>return</span> <span>sum</span><span>(</span><span>args</span><span>)</span> <span>print</span><span>(</span><span>add_numbers</span><span>(</span><span>1</span><span>,</span> <span>2</span><span>,</span> <span>3</span><span>))</span> <span># Output: 6 </span><span>print</span><span>(</span><span>add_numbers</span><span>(</span><span>10</span><span>,</span> <span>20</span><span>,</span> <span>30</span><span>,</span> <span>40</span><span>))</span> <span># Output: 100 </span><span>print</span><span>(</span><span>add_numbers</span><span>())</span> <span># Output: 0 (No arguments) </span>def add_numbers(*args): return sum(args) print(add_numbers(1, 2, 3)) # Output: 6 print(add_numbers(10, 20, 30, 40)) # Output: 100 print(add_numbers()) # Output: 0 (No arguments)
Enter fullscreen mode Exit fullscreen mode
How It Works?
-
*args
collects1, 2, 3
as a tuple →(1, 2, 3)
- The function sums all numbers and returns the result.
What is `kwargs`?**
-
**kwargs
allows a function to accept any number of keyword arguments. - These arguments are collected as a dictionary.
Example: Using `kwargs`**
<span>def</span> <span>print_info</span><span>(</span><span>**</span><span>kwargs</span><span>):</span><span>for</span> <span>key</span><span>,</span> <span>value</span> <span>in</span> <span>kwargs</span><span>.</span><span>items</span><span>():</span><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>key</span><span>}</span><span>: </span><span>{</span><span>value</span><span>}</span><span>"</span><span>)</span><span>print_info</span><span>(</span><span>name</span><span>=</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>25</span><span>,</span> <span>city</span><span>=</span><span>"</span><span>New York</span><span>"</span><span>)</span><span>def</span> <span>print_info</span><span>(</span><span>**</span><span>kwargs</span><span>):</span> <span>for</span> <span>key</span><span>,</span> <span>value</span> <span>in</span> <span>kwargs</span><span>.</span><span>items</span><span>():</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>key</span><span>}</span><span>: </span><span>{</span><span>value</span><span>}</span><span>"</span><span>)</span> <span>print_info</span><span>(</span><span>name</span><span>=</span><span>"</span><span>Alice</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>25</span><span>,</span> <span>city</span><span>=</span><span>"</span><span>New York</span><span>"</span><span>)</span>def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=25, city="New York")
Enter fullscreen mode Exit fullscreen mode
Output:
name: Aliceage: 25city: New Yorkname: Alice age: 25 city: New Yorkname: Alice age: 25 city: New York
Enter fullscreen mode Exit fullscreen mode
How It Works?
-
**kwargs
collectsname="Alice", age=25, city="New York"
as a dictionary:
<span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>Alice</span><span>'</span><span>,</span> <span>'</span><span>age</span><span>'</span><span>:</span> <span>25</span><span>,</span> <span>'</span><span>city</span><span>'</span><span>:</span> <span>'</span><span>New York</span><span>'</span><span>}</span><span>{</span><span>'</span><span>name</span><span>'</span><span>:</span> <span>'</span><span>Alice</span><span>'</span><span>,</span> <span>'</span><span>age</span><span>'</span><span>:</span> <span>25</span><span>,</span> <span>'</span><span>city</span><span>'</span><span>:</span> <span>'</span><span>New York</span><span>'</span><span>}</span>{'name': 'Alice', 'age': 25, 'city': 'New York'}
Enter fullscreen mode Exit fullscreen mode
Using *args
and `kwargs` Together**
You can combine both in a function.
Example:
<span>def</span> <span>user_info</span><span>(</span><span>user_id</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span><span>print</span><span>(</span><span>f</span><span>"</span><span>User ID: </span><span>{</span><span>user_id</span><span>}</span><span>"</span><span>)</span><span>print</span><span>(</span><span>"</span><span>Additional Info:</span><span>"</span><span>,</span> <span>args</span><span>)</span><span>print</span><span>(</span><span>"</span><span>Other Details:</span><span>"</span><span>,</span> <span>kwargs</span><span>)</span><span>user_info</span><span>(</span><span>101</span><span>,</span> <span>"</span><span>Developer</span><span>"</span><span>,</span> <span>"</span><span>Python</span><span>"</span><span>,</span> <span>name</span><span>=</span><span>"</span><span>John</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>30</span><span>)</span><span>def</span> <span>user_info</span><span>(</span><span>user_id</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span> <span>print</span><span>(</span><span>f</span><span>"</span><span>User ID: </span><span>{</span><span>user_id</span><span>}</span><span>"</span><span>)</span> <span>print</span><span>(</span><span>"</span><span>Additional Info:</span><span>"</span><span>,</span> <span>args</span><span>)</span> <span>print</span><span>(</span><span>"</span><span>Other Details:</span><span>"</span><span>,</span> <span>kwargs</span><span>)</span> <span>user_info</span><span>(</span><span>101</span><span>,</span> <span>"</span><span>Developer</span><span>"</span><span>,</span> <span>"</span><span>Python</span><span>"</span><span>,</span> <span>name</span><span>=</span><span>"</span><span>John</span><span>"</span><span>,</span> <span>age</span><span>=</span><span>30</span><span>)</span>def user_info(user_id, *args, **kwargs): print(f"User ID: {user_id}") print("Additional Info:", args) print("Other Details:", kwargs) user_info(101, "Developer", "Python", name="John", age=30)
Enter fullscreen mode Exit fullscreen mode
Output:
User ID: 101Additional Info: ('Developer', 'Python')Other Details: {'name': 'John', 'age': 30}User ID: 101 Additional Info: ('Developer', 'Python') Other Details: {'name': 'John', 'age': 30}User ID: 101 Additional Info: ('Developer', 'Python') Other Details: {'name': 'John', 'age': 30}
Enter fullscreen mode Exit fullscreen mode
How It Works?
-
101
→ goes intouser_id
-
"Developer", "Python"
→ goes into*args
as a tuple -
name="John", age=30
→ goes into `kwargs`** as a dictionary
Example in Django View
In Django ViewSets, *args, **kwargs
are often used to pass additional arguments.
Example in Django ViewSet
<span>from</span> <span>rest_framework.viewsets</span> <span>import</span> <span>ViewSet</span><span>from</span> <span>rest_framework.response</span> <span>import</span> <span>Response</span><span>class</span> <span>MyViewSet</span><span>(</span><span>ViewSet</span><span>):</span><span>def</span> <span>list</span><span>(</span><span>self</span><span>,</span> <span>request</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span><span>print</span><span>(</span><span>"</span><span>Args:</span><span>"</span><span>,</span> <span>args</span><span>)</span> <span># Tuple of extra positional arguments </span> <span>print</span><span>(</span><span>"</span><span>Kwargs:</span><span>"</span><span>,</span> <span>kwargs</span><span>)</span> <span># Dictionary of extra keyword arguments </span> <span>return</span> <span>Response</span><span>({</span><span>"</span><span>message</span><span>"</span><span>:</span> <span>"</span><span>Success</span><span>"</span><span>})</span><span>from</span> <span>rest_framework.viewsets</span> <span>import</span> <span>ViewSet</span> <span>from</span> <span>rest_framework.response</span> <span>import</span> <span>Response</span> <span>class</span> <span>MyViewSet</span><span>(</span><span>ViewSet</span><span>):</span> <span>def</span> <span>list</span><span>(</span><span>self</span><span>,</span> <span>request</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span> <span>print</span><span>(</span><span>"</span><span>Args:</span><span>"</span><span>,</span> <span>args</span><span>)</span> <span># Tuple of extra positional arguments </span> <span>print</span><span>(</span><span>"</span><span>Kwargs:</span><span>"</span><span>,</span> <span>kwargs</span><span>)</span> <span># Dictionary of extra keyword arguments </span> <span>return</span> <span>Response</span><span>({</span><span>"</span><span>message</span><span>"</span><span>:</span> <span>"</span><span>Success</span><span>"</span><span>})</span>from rest_framework.viewsets import ViewSet from rest_framework.response import Response class MyViewSet(ViewSet): def list(self, request, *args, **kwargs): print("Args:", args) # Tuple of extra positional arguments print("Kwargs:", kwargs) # Dictionary of extra keyword arguments return Response({"message": "Success"})
Enter fullscreen mode Exit fullscreen mode
How It Works in Django?
-
*args
captures extra positional arguments. -
**kwargs
captures additional keyword arguments (likepk
inretrieve
).
Summary Table
Concept | Description | Stored As | Example Call | Example Inside Function |
---|---|---|---|---|
*args |
Multiple positional arguments | tuple |
func(1, 2, 3) |
(1, 2, 3) |
**kwargs |
Multiple keyword arguments | dict |
func(name="Alice", age=25) |
{'name': 'Alice', 'age': 25} |
Best Practices
Use *args
when you don’t know how many positional arguments will be passed.
Use **kwargs
when you don’t know how many keyword arguments will be passed.
Use both when creating flexible Django views or utility functions.
Understanding *args
and `kwargs` in Flask & FastAPI**
Both Flask and FastAPI allow you to use *args
and **kwargs
to handle dynamic arguments in request handling.
Example in Flask
Flask allows dynamic routes, and *args
and **kwargs
can help handle unknown parameters.
Example: Flask Route with *args
and `kwargs`**
<span>from</span> <span>flask</span> <span>import</span> <span>Flask</span><span>,</span> <span>request</span><span>,</span> <span>jsonify</span><span>app</span> <span>=</span> <span>Flask</span><span>(</span><span>__name__</span><span>)</span><span>@app.route</span><span>(</span><span>'</span><span>/user/<int:user_id></span><span>'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'</span><span>GET</span><span>'</span><span>])</span><span>def</span> <span>get_user</span><span>(</span><span>user_id</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span><span>extra_params</span> <span>=</span> <span>request</span><span>.</span><span>args</span> <span># Get query parameters </span> <span>return</span> <span>jsonify</span><span>({</span><span>"</span><span>user_id</span><span>"</span><span>:</span> <span>user_id</span><span>,</span><span>"</span><span>args</span><span>"</span><span>:</span> <span>args</span><span>,</span><span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span><span>,</span><span>"</span><span>query_params</span><span>"</span><span>:</span> <span>extra_params</span><span>.</span><span>to_dict</span><span>()</span> <span># Convert to dictionary </span> <span>})</span><span>if</span> <span>__name__</span> <span>==</span> <span>'</span><span>__main__</span><span>'</span><span>:</span><span>app</span><span>.</span><span>run</span><span>(</span><span>debug</span><span>=</span><span>True</span><span>)</span><span>from</span> <span>flask</span> <span>import</span> <span>Flask</span><span>,</span> <span>request</span><span>,</span> <span>jsonify</span> <span>app</span> <span>=</span> <span>Flask</span><span>(</span><span>__name__</span><span>)</span> <span>@app.route</span><span>(</span><span>'</span><span>/user/<int:user_id></span><span>'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'</span><span>GET</span><span>'</span><span>])</span> <span>def</span> <span>get_user</span><span>(</span><span>user_id</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span> <span>extra_params</span> <span>=</span> <span>request</span><span>.</span><span>args</span> <span># Get query parameters </span> <span>return</span> <span>jsonify</span><span>({</span> <span>"</span><span>user_id</span><span>"</span><span>:</span> <span>user_id</span><span>,</span> <span>"</span><span>args</span><span>"</span><span>:</span> <span>args</span><span>,</span> <span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span><span>,</span> <span>"</span><span>query_params</span><span>"</span><span>:</span> <span>extra_params</span><span>.</span><span>to_dict</span><span>()</span> <span># Convert to dictionary </span> <span>})</span> <span>if</span> <span>__name__</span> <span>==</span> <span>'</span><span>__main__</span><span>'</span><span>:</span> <span>app</span><span>.</span><span>run</span><span>(</span><span>debug</span><span>=</span><span>True</span><span>)</span>from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/user/<int:user_id>', methods=['GET']) def get_user(user_id, *args, **kwargs): extra_params = request.args # Get query parameters return jsonify({ "user_id": user_id, "args": args, "kwargs": kwargs, "query_params": extra_params.to_dict() # Convert to dictionary }) if __name__ == '__main__': app.run(debug=True)
Enter fullscreen mode Exit fullscreen mode
How It Works?
- The URL pattern
/user/<int:user_id>
capturesuser_id
as a positional argument. -
*args
and**kwargs
capture additional data (if provided). -
request.args
retrieves query parameters.
Testing in Postman
Request:
<span>GET http://127.0.0.1:5000/user/123?name=Alice&age=30 </span><span>GET http://127.0.0.1:5000/user/123?name=Alice&age=30 </span>GET http://127.0.0.1:5000/user/123?name=Alice&age=30
Enter fullscreen mode Exit fullscreen mode
Response:
<span>{</span><span> </span><span>"user_id"</span><span>:</span><span> </span><span>123</span><span>,</span><span> </span><span>"args"</span><span>:</span><span> </span><span>[],</span><span> </span><span>"kwargs"</span><span>:</span><span> </span><span>{},</span><span> </span><span>"query_params"</span><span>:</span><span> </span><span>{</span><span> </span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>"30"</span><span> </span><span>}</span><span> </span><span>}</span><span> </span><span>{</span><span> </span><span>"user_id"</span><span>:</span><span> </span><span>123</span><span>,</span><span> </span><span>"args"</span><span>:</span><span> </span><span>[],</span><span> </span><span>"kwargs"</span><span>:</span><span> </span><span>{},</span><span> </span><span>"query_params"</span><span>:</span><span> </span><span>{</span><span> </span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>"30"</span><span> </span><span>}</span><span> </span><span>}</span><span> </span>{ "user_id": 123, "args": [], "kwargs": {}, "query_params": { "name": "Alice", "age": "30" } }
Enter fullscreen mode Exit fullscreen mode
Example in FastAPI
FastAPI uses *args
and **kwargs
in path operations and dependency injection.
Example: FastAPI with *args
and `kwargs`**
<span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span><span>,</span> <span>Query</span><span>from</span> <span>typing</span> <span>import</span> <span>Dict</span><span>app</span> <span>=</span> <span>FastAPI</span><span>()</span><span>@app.get</span><span>(</span><span>"</span><span>/items/{item_id}</span><span>"</span><span>)</span><span>async</span> <span>def</span> <span>get_item</span><span>(</span><span>item_id</span><span>:</span> <span>int</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span><span>return</span> <span>{</span><span>"</span><span>item_id</span><span>"</span><span>:</span> <span>item_id</span><span>,</span><span>"</span><span>args</span><span>"</span><span>:</span> <span>args</span><span>,</span><span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span><span>}</span><span>@app.get</span><span>(</span><span>"</span><span>/query/</span><span>"</span><span>)</span><span>async</span> <span>def</span> <span>query_example</span><span>(</span><span>name</span><span>:</span> <span>str</span> <span>=</span> <span>Query</span><span>(</span><span>None</span><span>),</span> <span>age</span><span>:</span> <span>int</span> <span>=</span> <span>Query</span><span>(</span><span>None</span><span>),</span> <span>**</span><span>kwargs</span><span>:</span> <span>Dict</span><span>):</span><span>return</span> <span>{</span><span>"</span><span>name</span><span>"</span><span>:</span> <span>name</span><span>,</span><span>"</span><span>age</span><span>"</span><span>:</span> <span>age</span><span>,</span><span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span><span>}</span><span>from</span> <span>fastapi</span> <span>import</span> <span>FastAPI</span><span>,</span> <span>Query</span> <span>from</span> <span>typing</span> <span>import</span> <span>Dict</span> <span>app</span> <span>=</span> <span>FastAPI</span><span>()</span> <span>@app.get</span><span>(</span><span>"</span><span>/items/{item_id}</span><span>"</span><span>)</span> <span>async</span> <span>def</span> <span>get_item</span><span>(</span><span>item_id</span><span>:</span> <span>int</span><span>,</span> <span>*</span><span>args</span><span>,</span> <span>**</span><span>kwargs</span><span>):</span> <span>return</span> <span>{</span> <span>"</span><span>item_id</span><span>"</span><span>:</span> <span>item_id</span><span>,</span> <span>"</span><span>args</span><span>"</span><span>:</span> <span>args</span><span>,</span> <span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span> <span>}</span> <span>@app.get</span><span>(</span><span>"</span><span>/query/</span><span>"</span><span>)</span> <span>async</span> <span>def</span> <span>query_example</span><span>(</span><span>name</span><span>:</span> <span>str</span> <span>=</span> <span>Query</span><span>(</span><span>None</span><span>),</span> <span>age</span><span>:</span> <span>int</span> <span>=</span> <span>Query</span><span>(</span><span>None</span><span>),</span> <span>**</span><span>kwargs</span><span>:</span> <span>Dict</span><span>):</span> <span>return</span> <span>{</span> <span>"</span><span>name</span><span>"</span><span>:</span> <span>name</span><span>,</span> <span>"</span><span>age</span><span>"</span><span>:</span> <span>age</span><span>,</span> <span>"</span><span>kwargs</span><span>"</span><span>:</span> <span>kwargs</span> <span>}</span>from fastapi import FastAPI, Query from typing import Dict app = FastAPI() @app.get("/items/{item_id}") async def get_item(item_id: int, *args, **kwargs): return { "item_id": item_id, "args": args, "kwargs": kwargs } @app.get("/query/") async def query_example(name: str = Query(None), age: int = Query(None), **kwargs: Dict): return { "name": name, "age": age, "kwargs": kwargs }
Enter fullscreen mode Exit fullscreen mode
How It Works?
-
*args
and**kwargs
capture additional parameters that may be sent in the request. -
Query(None)
allows extracting query parameters dynamically. - `kwargs: Dict`** allows capturing additional keyword parameters.
Testing in Postman
Request:
<span>GET http://127.0.0.1:8000/query/?name=Alice&age=30&city=NewYork </span><span>GET http://127.0.0.1:8000/query/?name=Alice&age=30&city=NewYork </span>GET http://127.0.0.1:8000/query/?name=Alice&age=30&city=NewYork
Enter fullscreen mode Exit fullscreen mode
Response:
<span>{</span><span> </span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>30</span><span>,</span><span> </span><span>"kwargs"</span><span>:</span><span> </span><span>{</span><span> </span><span>"city"</span><span>:</span><span> </span><span>"NewYork"</span><span> </span><span>}</span><span> </span><span>}</span><span> </span><span>{</span><span> </span><span>"name"</span><span>:</span><span> </span><span>"Alice"</span><span>,</span><span> </span><span>"age"</span><span>:</span><span> </span><span>30</span><span>,</span><span> </span><span>"kwargs"</span><span>:</span><span> </span><span>{</span><span> </span><span>"city"</span><span>:</span><span> </span><span>"NewYork"</span><span> </span><span>}</span><span> </span><span>}</span><span> </span>{ "name": "Alice", "age": 30, "kwargs": { "city": "NewYork" } }
Enter fullscreen mode Exit fullscreen mode
Summary of *args
and `kwargs` in Flask & FastAPI**
Framework | Use Case | Example Call | Result |
---|---|---|---|
Flask | Capture extra route parameters and query params | /user/123?name=Alice&age=30 |
Returns user_id , args , kwargs , and query_params |
FastAPI | Handle query parameters dynamically | /query/?name=Alice&age=30&city=NewYork |
Captures name , age , and additional kwargs |
Best Practices
Use *args
for positional arguments (though rarely needed in APIs).
Use `kwargs to capture additional query params dynamically**.
request.args.to_dict()
**In Flask, use ** to handle query parameters.
Query()
**In FastAPI, use and
kwargs: Dict` for flexibility.
暂无评论内容