الـ *args
جزء من قسم البرمجة كائنية التوجه في رحلة Python على Coddy. الدرس 42 من 64.
تسمح المعلمة *args للطريقة بقبول أي عدد من الوسائط الموضعية. تجمع العلامة النجمية جميع الوسائط الموضعية الإضافية في صف.
إليك مثالًا على طريقة تستخدم *args:
class Calculator:
def add_numbers(self, *args):
return sum(args)
def show_numbers(self, *args):
for i, num in enumerate(args):
print(f"Number {i+1}: {num}")استدعِ الطريقة بعدد مختلف من الوسائط:
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1) # 6
print(result2) # 150تجمع *args جميع الوسائط في صف:
calc.show_numbers(5, 10, 15, 20)المخرجات:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20اجمع المعاملات العادية مع *args:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # سطر جديد
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")استخدم *args في أساليب المُنشئ:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
def show_team(self):
print(f"Team: {self.team_name}")
for player in self.players:
print(f"- {player}")
team = Team("Warriors", "Alice", "Bob", "Charlie", "Diana")
team.show_team()المخرجات:
6
150
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20
[INFO] User logged in
[ERROR] Connection failed
Team: Warriors
- Alice
- Bob
- Charlie
- Dianaيمكنك أيضًا فكّ حزم الوسائط عند استدعاء الأساليب:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # يفك حزم القائمة
print(result) # 15النقطة الأساسية: يجمع *args أي عدد من الوسائط الموضعية في صف. استخدمه عندما لا تعرف عدد الوسائط التي سيتم تمريرها إلى طريقة. الاسم args اصطلاحي - يمكنك استخدام أي اسم بعد علامة النجمة، لكن args هو الاسم القياسي.
التحدي
سهلفي هذا التحدي، ستنفّذ دالة مرنة لأدوات التعامل مع الأرقام.
عدّل الملف number_utils.py لتنفيذ الدالة sum_all_numbers التي تقبل أي عدد من الوسائط الرقمية وتُرجع مجموعها. يجب أن تقوم الدالة بما يلي:
- إرجاع 0 إذا لم يتم توفير أي وسائط
- طباعة "Error: All arguments must be numbers" وإرجاع None إذا تم توفير أي وسائط غير رقمية
- القيم المنطقية (
True/False) لا تُعدّ أرقامًا هنا، ويجب رفضها أيضًا، رغم أنboolفئة فرعية منint
يحتوي الملف number_utils.py على تعليقات TODO مفصّلة لإرشادك في تنفيذك. اتبع هذه التعليقات بعناية لضمان استيفاء حلك لجميع المتطلبات.
جرّب بنفسك
from number_utils import sum_all_numbers
# معالج شامل لحالات الاختبار
test_case = input()
if test_case == "basic_test":
# اختبار الوظائف الأساسية مع الأعداد الصحيحة الموجبة
print(sum_all_numbers(1, 2, 3)) # يجب أن يُرجع 6
print(sum_all_numbers()) # يجب أن يُرجع 0
print(sum_all_numbers(10, 20, 30, 40)) # يجب أن يُرجع 100
print(sum_all_numbers(1, 2, "three")) # يجب أن يطبع خطأ ويُرجع None
elif test_case == "float_test":
# اختبار مع أرقام الفاصلة العائمة
print(sum_all_numbers(1.1, 2.2, 3.3)) # يجب أن يُرجع 6.6
print(sum_all_numbers(5.5, 5.0)) # يجب أن يُرجع 10.5
elif test_case == "mixed_numbers_test":
# اختبار مع مزيج من الأعداد الصحيحة وأرقام الفاصلة العائمة
print(sum_all_numbers(5, 5.5)) # يجب أن يُرجع 10.5
print(sum_all_numbers(10, 20.5, 30, 40)) # يجب أن يُرجع 100.5
elif test_case == "zero_values_test":
# اختبار مع قيم صفرية
print(sum_all_numbers(0, 0, 0)) # يجب أن يُرجع 0
print(sum_all_numbers(0)) # يجب أن يُرجع 0
print(sum_all_numbers()) # يجب أن يُرجع 0
elif test_case == "negative_values_test":
# اختبار مع القيم السالبة
print(sum_all_numbers(-1, -2, -3)) # يجب أن يُرجع -6
print(sum_all_numbers(-5, -5)) # يجب أن يُرجع -10
print(sum_all_numbers(-5, 5)) # يجب أن يُرجع 0
elif test_case == "large_values_test":
# اختبار مع قيم كبيرة جدًا
print(sum_all_numbers(1000000000, 1000000000)) # يجب أن يُرجع 2000000000
print(sum_all_numbers(1000000000, 2000000000.5)) # يجب أن يُرجع 3000000000.5
elif test_case == "single_value_test":
# اختبار مع قيمة واحدة
print(sum_all_numbers(5)) # يجب أن يُرجع 5
print(sum_all_numbers(-10)) # يجب أن يُرجع -10
print(sum_all_numbers(3.5)) # يجب أن يُرجع 3.5
elif test_case == "error_handling_test":
# اختبار مع قيم غير رقمية متنوعة
print(sum_all_numbers("string")) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers([1, 2, 3])) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers({"key": "value"})) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers(True)) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers(None)) # يجب أن يطبع خطأ ويُرجع None
elif test_case == "mixed_valid_invalid_test":
# اختبار مع مزيج من القيم الصالحة وغير الصالحة
print(sum_all_numbers(1, 2, "three")) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers(1, [2, 3], 4)) # يجب أن يطبع خطأ ويُرجع None
print(sum_all_numbers(1.5, "two", 3)) # يجب أن يطبع خطأ ويُرجع None
elif test_case == "empty_args_test":
# اختبار بدون وسائط
print(sum_all_numbers()) # يجب أن يُرجع 0يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكالتدرّب بنفسك: مترجم Python عبر الإنترنت