Understanding ‘*args’ and ‘**kwargs’ in Python

Understanding *args and `kwargs` in Python**

In Python, *args and **kwargs are used to pass a variable number of arguments to a function.


READ Complete Article on this

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 collects 1, 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: Alice
age: 25
city: New York
name: Alice
age: 25
city: New York
name: Alice age: 25 city: New York

Enter fullscreen mode Exit fullscreen mode

How It Works?

  • **kwargs collects name="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: 101
Additional 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 into user_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 (like pk in retrieve).

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> captures user_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?

  1. *args and **kwargs capture additional parameters that may be sent in the request.
  2. Query(None) allows extracting query parameters dynamically.
  3. `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**.
**In Flask, use
request.args.to_dict()** to handle query parameters.
**In FastAPI, use
Query() and kwargs: Dict` for flexibility.

原文链接:Understanding ‘*args’ and ‘**kwargs’ in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
It is during our darkest moments that we must focus to see the light.
越是在艰难困苦的时候,我们越是要看到希望
评论 抢沙发

请登录后发表评论

    暂无评论内容