تكرار السؤال: …
الإجابة المختصرة
*args يجمع المعاملات الموضعية الإضافية في tuple، و **kwargs يجمع المعاملات المسماة الإضافية في dict، ويمكن استخدام * و ** عند الاستدعاء لفك القيم.
الشرح
يناسب هذا النمط الدوال الوسيطة (wrappers) مثل decorators التي تمرر المعاملات كما هي للدالة الأصلية. لكن استخدامه في واجهات domain يجعل التوقيع غامضًا ويعطّل الإكمال التلقائي وفحص الأنواع. يمكن وصف أنواعها عبر *args: int و **kwargs: str، أو بدقة أكبر عبر ParamSpec في الـ decorators و Unpack[TypedDict] لـ kwargs.
مثال بالكود
def log_call(fn):
def wrapper(*args, **kwargs):
print(f"calling {fn.__name__} args={args} kwargs={kwargs}")
return fn(*args, **kwargs)
return wrapper
params = {"timeout": 3}
fetch("https://example.com", **params)أخطاء شائعة
- استخدام **kwargs في دوال الأعمال لتجنب تحديد المعاملات صراحةً.
- تمرير kwargs لدالة أخرى دون إزالة المفاتيح التي استهلكتها الدالة الحالية.