πΉ 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
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)
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`**
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="New York")
Output:
name: Alice
age: 25
city: New York
How It Works?
-
**kwargs
collectsname="Alice", age=25, city="New York"
as a dictionary:
{'name': 'Alice', 'age': 25, 'city': 'New York'}
πΉ Using *args
and `kwargs` Together**
You can combine both in a function.
Example:
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)
Output:
User ID: 101
Additional Info: ('Developer', 'Python')
Other Details: {'name': 'John', 'age': 30}
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
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"})
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`**
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)
π 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:
GET http://127.0.0.1:5000/user/123?name=Alice&age=30
Response:
{
"user_id": 123,
"args": [],
"kwargs": {},
"query_params": {
"name": "Alice",
"age": "30"
}
}
πΉ Example in FastAPI
FastAPI uses *args
and **kwargs
in path operations and dependency injection.
β
Example: FastAPI with *args
and `kwargs`**
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
}
π 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:
GET http://127.0.0.1:8000/query/?name=Alice&age=30&city=NewYork
Response:
{
"name": "Alice",
"age": 30,
"kwargs": {
"city": "NewYork"
}
}
πΉ 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.
Top comments (0)