اور کسی function کو میں arguments قبول کرنے دیتے ہیں۔ اضافی arguments کو ایک tuple میں جمع کرتا ہے؛ اضافی arguments کو ایک dict میں جمع کرتا ہے۔ (نام محض convention ہیں — اصل اہمیت اور کی ہے۔)
اور کسی function کو میں arguments قبول کرنے دیتے ہیں۔ اضافی arguments کو ایک tuple میں جمع کرتا ہے؛ اضافی arguments کو ایک dict میں جمع کرتا ہے۔ (نام محض convention ہیں — اصل اہمیت اور کی ہے۔)
*args**kwargs*args**kwargs***def total(*args): # collects all positional args into a tuple
print(args) # e.g. (1, 2, 3)
return sum(args)
total(1, 2, 3) # 6
total(1, 2, 3, 4, 5) # 15 — any number of args
def configure(**kwargs): # collects keyword args into a dict
print(kwargs) # e.g. {"host": "localhost", "port": 8080}
for key, value in kwargs.items():
print(f"{key} = {value}")
configure(host="localhost", port=8080, debug=True)
def func(a, b, *args, **kwargs):
# a, b → required positional
# args → extra positional (tuple)
# kwargs → extra keyword (dict)
...
func(1, 2, 3, 4, x=5, y=6)
# a=1, b=2, args=(3, 4), kwargs={"x": 5, "y": 6}
لازمی ترتیب یہ ہے: عام params، پھر *args، پھر **kwargs۔
# `*` and `**` also UNPACK collections INTO arguments at the call site
numbers = [1, 2, 3]
total(*numbers) # same as total(1, 2, 3)
settings = {"host": "x", "port": 80}
configure(**settings) # same as configure(host="x", port=80)
وہی syntax ایک list/dict کو positional/keyword arguments میں unpack کرتا ہے — arguments forward کرنے کے لیے کارآمد۔
def wrapper(*args, **kwargs):
# accept ANY arguments and pass them through unchanged
return original_func(*args, **kwargs)
یہ pass-through pattern ہی وہ طریقہ ہے جس سے decorators اور wrapper functions کسی بھی function signature کو سنبھالتے ہیں۔
*args/**kwargs لچکدار function signatures کو ممکن بناتے ہیں جو کسی بھی تعداد میں arguments قبول کرتے ہیں — general-purpose utilities، wrappers اور خاص طور پر decorators لکھنے کے لیے ضروری (جنہیں نامعلوم signatures والے functions کو *args, **kwargs کے ذریعے wrap کرنا پڑتا ہے)۔
Unpacking رخ (*list، **dict) arguments کو forward یا spread کرنے کے لیے اتنا ہی مفید ہے۔
جمع کرنے اور unpacking دونوں کو سمجھنا قابلِ استعمال، generic Python code لکھنے اور ان متعدد library APIs اور decorators کو پڑھنے کی کنجی ہے جو ان خصوصیات پر انحصار کرتے ہیں۔