شارك المقالة

شرح args وkwargs في Python يبدأ بالتفريق بين القيم الموضعية والقيم المسماة. تجمع *args الوسائط الموضعية الإضافية في tuple، وتجمع **kwargs الوسائط المسماة الإضافية في dict. النجوم هي التي تحدد السلوك؛ الاسمان args وkwargs مجرد اتفاق شائع. سنجمع درجات وننشئ ملفًا تعريفيًا ثم نمرر البيانات إلى دوال أصغر، مع الحفاظ على اسم ومعنى كل قيمة بدل تعريف دوال كثيرة بالاسم نفسه فتستبدل إحداها الأخرى.

التجهيز والتشغيل

استخدم Python 3.9 أو أحدث واحفظ المثال في ملف مستقل خارج مجلد مكتبات Python.

python lesson_25605.py

تجميع الدرجات وفك القائمة

تجمع total_scores القيم باستخدام sum، ويعيد الاستدعاء بلا درجات صفرًا حسب هوية الجمع. total_scores(scores) يمرر القائمة كعنصر واحد، بينما total_scores(*scores) يفك عناصرها إلى وسائط مستقلة. لا تعني النجمة أنها تحول البيانات إلى أرقام؛ يجب أن تدعم القيم الجمع المقصود. إذا كانت البيانات نصوص إدخال فحوّلها وتحقق منها قبل الاستدعاء، ولا تعتمد على رسالة TypeError لتحديد كل قيمة غير مناسبة في قائمة كبيرة.

الوسائط المسماة فقط

في make_profile يأتي age بعد نجمة منفردة، ولذلك يجب تمريره باسم age عند الحاجة. هذا يجعل قراءة الاستدعاء أوضح من تخمين معنى الرقم الثاني. تبقى تفاصيل مثل city في قاموس مستقل اسمه details بدل دمجها عشوائيًا فوق name وage. يحصل name وage على قيمهما وفق توقيع الدالة، ولا يظهران في kwargs الإضافية. يعيد المثال بيانات بدل الاكتفاء بطباعتها، كي تستطيع دالة أخرى استخدامها واختبارها.

المثال البرمجي الكامل

def total_scores(*scores):
    return sum(scores)

def make_profile(name, *, age=18, **details):
    return {"name": name, "age": age, "details": dict(details)}

def summarize(*scores, name, **details):
    return {"profile": make_profile(name, **details), "total": total_scores(*scores)}

if __name__ == "__main__":
    scores = [10, 15, 20]
    options = {"age": 22, "city": "Cairo"}
    print(total_scores(1, 2, 3))
    print(total_scores(*scores))
    print(make_profile("Ali", **options))
    print(summarize(*scores, name="Ali", **options))

القاموس عند التكرار وعند الفك

المرور على قاموس يعطي المفاتيح افتراضيًا؛ إذا أردت القيم مع الأسماء فاستخدم items. أما **options في الاستدعاء فتفك المفاتيح إلى أسماء وسائط، ويجب أن تكون أسماء نصية مناسبة. لا تمرر age مرتين مرة مباشرة ومرة داخل options، لأن Python سترفض الاستدعاء بقيمة مكررة. هذا أفضل من اختيار قيمة صامتًا قد تخفي خطأ تكوين بيانات النموذج أو إعدادات التطبيق.

تمرير الوسائط إلى دوال أصغر

تجمع summarize الدرجات في جزء مستقل وتستدعي make_profile للاسم والتفاصيل. بهذه الطريقة يبقى منطق الملف التعريفي في موضع واحد. وجود name بعد *scores يجعله مطلوبًا باسم واضح في الاستدعاء. لا تمرر kwargs من مصدر خارجي إلى أي دالة قوية دون مراجعة المفاتيح؛ الدوال التي تقبل أي اسم قد تخفي خطأ إملائيًا في إعداد. في مثالنا نحفظ التفاصيل كما هي لتوضيح التجميع، بينما يضع التطبيق الحقيقي قائمة حقول يتوقعها.

متى تكون القيمة الافتراضية مشكلة؟

العمر الافتراضي 18 هنا رقم ثابت، لكن استخدام قائمة افتراضية قابلة للتعديل قد يجعل الاستدعاءات تتشارك الحالة. عند الحاجة إلى قائمة اختيارية استخدم None ثم أنشئ قائمة داخل الدالة. لا تستخدم args وkwargs لإخفاء توقيع دالة يمكن تعريفها بوسيطين واضحين. كما أن ترتيب تعريف الوسائط الموضعية والافتراضية والمسماة يتبع قواعد Python، لذا اقرأ SyntaxError في تعريف الدالة قبل البحث عن المشكلة في الاستدعاء.

نتائج المثال واختبارها

شغل الملف لتجد مجموع 1 و2 و3 يساوي 6 ومجموع الدرجات 10 و15 و20 يساوي 45، مع حفظ city داخل details. جرّب حذف name من summarize لتلاحظ أنه مطلوب، ومرر العمر موضعيًا إلى make_profile لتلاحظ شرط الوسيط المسمى فقط. ثم أضف تفاصيل عربية وتأكد أن المفاتيح والقيم بقيت كما أرسلتها. الاختبار الجيد يقارن البنية كاملة لا مجرد ظهور كلمة واحدة في النص المطبوع.

تمرين لتصميم واجهة دالة

أنشئ دالة تلخص عدة أسعار أو أطوال مع وسيط مسمى يحدد عنوان التقرير، ثم افصل الطباعة عن الحساب. قرر كيف تتعامل مع قائمة فارغة ومدخل غير رقمي وحدد ذلك في وصف الدالة. جرّب تمرير قاموس بوسيط مكرر وتأكد أنك تفهم سبب الرفض. عندما تصبح جميع الإعدادات مخفية داخل kwargs كبيرة، فكر في توقيع صريح أو كائن إعدادات بدل إضافة مزيد من الأسماء غير الموثقة.

المراجع

تعريف الدوال والوسائط

الصور والفيديو من الشرح السابق

الكود النصي أعلاه هو النسخة المصححة؛ قد تختلف المواد المرئية السابقة في أسماء المتغيرات أو طريقة التشغيل.

كيفية استبدال comma باي نص اخر واضافة نص في النهايه بلغة بايثون امثلة جديدة في def بلغة البايثون شرح استخدام الامر *args في لغة pythne شرح استخدام الامر *kwargs في لغة pythne كيفية استخدام args و kwargs في نفس الوقت بلغة بايثون مثال اخر في استخدام args and kwargs
شاهد أيضًا
مقالات ذات صلة
🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع