` - args` and ` - kwargs` — flexible argument passing
1.2.29· Coding › Introduction to Programming (Python)
YE CHEEZ EXIST KYU KARTI HAI?
* aur ** unpacking/packing operators hain. args aur kwargs naam sirf convention hain — asli cheez * aur ** hai.
YE HAIN KYA EXACTLY?
Toh * ke do kaam hain, side ke hisaab se:
| Side | *seq |
**dict |
|---|---|---|
| Definition (collect/pack) | extra positionals ko gather karo → tuple | extra keywords ko gather karo → dict |
| Call (spread/unpack) | list/tuple ko positionals mein spread karo | dict ko keyword args mein spread karo |
KAISE KAAM KARTA HAI — First Principles se samjho
Sabse simple cheez se shuru karo aur badhate jao.
Step 1 — ek fixed function.
def add(a, b):
return a + b
add(2, 3) # 5Ye step kyun? Baseline rigidity establish karta hai: exactly 2 args allowed.
Step 2 — Python ko extra values ek tuple mein pack karne do.
def add(*args):
print(args) # (2, 3, 4) — ek TUPLE
total = 0
for x in args:
total += x
return total
add(2, 3, 4) # 9Ye step kyun? * Python ko batata hai: "jo bhi extra positional values bachi hain, unhe ek tuple mein daal do jiska naam args ho." Ab function kisi bhi count ke liye kaam karta hai.
Step 3 — keyword leftovers ek dict mein jaate hain.
def describe(**kwargs):
print(kwargs) # {'name': 'Ravi', 'age': 20} — ek DICT
for key, value in kwargs.items():
print(f"{key} = {value}")
describe(name="Ravi", age=20)Ye step kyun? ** un key=value pairs ko pakadta hai jinke liye koi named parameter match nahi karta, aur ek dictionary banata hai.
Step 4 — canonical full ordering.
def f(a, b, *args, **kwargs):
...Definition mein legal order hamesha yeh hota hai:
Kyun? Python pehle named positionals satisfy karta hai, phir baaki positionals *args mein sweep karta hai, phir baaki keywords **kwargs mein sweep karta hai. **kwargs last hona chahiye kyunki iske baad kuch bhi nahi aa sakta — ye ek "catch-all dict" hai.

Call-site unpacking (mirror image)
def add(a, b, c):
return a + b + c
nums = [1, 2, 3]
add(*nums) # same as add(1, 2, 3) -> 6
opts = {'a': 1, 'b': 2, 'c': 3}
add(**opts) # same as add(a=1, b=2, c=3) -> 6Worked Examples
Forecast-then-Verify
Common Mistakes (Steel-manned)
Recall Feynman: ek 12-saal ke bachhe ko samjhao
Ek teacher ka imagine karo jo homework collect kar raha hai. *args ek badi tray hai: "kitne bhi papers yahan phenk do, order mein, aur main unhe stack karke rakhunga." **kwargs ek labelled box hai: "agar tumhare paper par ek name tag hai jaise name=Ravi, isko is box mein daal do aur main yaad rakhunga ki kaun sa tag kaun se paper ke saath hai." Teacher (function) ko pehle se kabhi pata nahi kitne students aayenge — lekin tray aur labelled box koi bhi amount rakh sakte hain. Aur jab teacher woh pile doosre teacher ko deta hai, toh aage * lagaane ka matlab hai "in papers ko ek ek karke wapas spread karo."
Flashcards
*args arguments ko kis cheez mein collect karta hai?
**kwargs arguments ko kis cheez mein collect karta hai?
Kya args mutable hai?
Definition mein required parameter order kya hai?
*args, keyword-only, **kwargs.Call site par, f(*mylist) kya karta hai?
Call site par, f(**mydict) kya karta hai?
Definition mein **kwargs last kyun hona chahiye?
Agar def f(*nums) ho aur aap f() call karo, toh nums kya hoga?
().{**a, **b} conflicting keys par kya karta hai?
b (baad wale) ki keys a wali keys ko override karti hain.Kya args/kwargs naam Python ke liye required hain?
* aur ** matter karte hain; naam convention hain.Decorators arbitrary arguments kaise forward karte hain?
*args, **kwargs se catch karke aur func(*args, **kwargs) se re-call karke.Connections
- Functions and Parameters — woh foundation jisko
*args/**kwargsextend karte hain. - Default Arguments — catch-alls ke saath combine karo flexible signatures ke liye.
- Tuples —
*argsjo produce karta hai. - Dictionaries —
**kwargsjo produce karta hai. - Decorators — argument forwarding ke heavy users.
- Unpacking Assignment —
a, *rest = [1,2,3]mein bhi same star idea use hota hai.