الـ *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)
مقدمة إلى OOPالملفات الخارجيةالصفوف مقابل الكائناتالمعامل selfالأساليبالسماتالأسلوب الباني (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكالتدرّب بنفسك: مترجم Python عبر الإنترنت