و تسمح للدالة بقبول من الوسائط. يجمع الوسائط الإضافية في tuple؛ يجمع الوسائط الإضافية في dict. (الأسماء هي اتفاقية — و هما ما يهم.)
*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}
الترتيب المطلوب هو: المعاملات العادية، ثم *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)
نفس الصيغة تفك تغليف list/dict إلى وسائط موضعية/مفتاحية — مفيد جداً لإعادة توجيه الوسائط.
def wrapper(*args, **kwargs):
# accept ANY arguments and pass them through unchanged
return original_func(*args, **kwargs)
هذا نمط المرور المباشر هو كيفية تعامل المزخرفات والدوال الملفوفة مع أي توقيع دالة عبر *args, **kwargs.
*args/**kwargs تمكّن من توقيعات دوال مرنة تقبل أي عدد من الوسائط — ضرورية لكتابة أدوات عامة الغرض، وأغلفة، وخاصة المزخرفات (التي يجب أن تلف دوال ذات توقيعات غير معروفة عبر *args, **kwargs).
اتجاه فك التغليف (*list, **dict) مفيد بالتساوي لإعادة التوجيه أو نشر الوسائط.
فهم كل من الجمع وفك التغليف هو أساسي لكتابة كود Python قابل لإعادة الاستخدام والعام، وقراءة العديد من واجهات برمجة التطبيقات والمزخرفات التي تعتمد على هذه الميزات.