اقترح جويدو فان روسوم إضافة عوامل مطابقة الأنماط إلى بايثون

جويدو فان روسوم المقدمة مسودة لمراجعة المجتمع مواصفة لتنفيذ عوامل مطابقة الأنماط (المطابقة والحالة) في بايثون. تجدر الإشارة إلى أن المقترحات الخاصة بإضافة عوامل مطابقة الأنماط قد تم نشرها بالفعل في عامي 2001 و2006 (بيب-0275, بيب-3103)، ولكن تم رفضها لصالح تحسين بناء "if ... elif ... else" لتجميع السلاسل المطابقة.

يشبه التنفيذ الجديد إلى حد كبير عامل التشغيل "المطابقة" المتوفر في Scala وRust وF#، والذي يقارن نتيجة تعبير محدد بقائمة من الأنماط المدرجة في الكتل بناءً على عامل التشغيل "الحالة". على عكس عامل التشغيل "switch" المتوفر في لغات C وJava وJavaScript، فإن التعبيرات المستندة إلى "match" تقدم أكثر من ذلك بكثير وظائف واسعة. تجدر الإشارة إلى أن المشغلين المقترحين سيعملون على تحسين إمكانية قراءة التعليمات البرمجية، وتبسيط المقارنة بين كائنات Python التعسفية وتصحيح الأخطاء، وكذلك زيادة موثوقية التعليمات البرمجية بفضل إمكانية التمديد فحص النوع الثابت.

تعريف http_error(الحالة):
حالة المباراة:
القضية 400:
عودة "طلب سيء"
الحالة 401|403|404:
العودة "غير مسموح"
القضية 418:
العودة "أنا إبريق الشاي"
قضية _:
العودة "شيء آخر"

على سبيل المثال، يمكنك فك حزم الكائنات والصفوف والقوائم والتسلسلات العشوائية لربط المتغيرات بناءً على القيم الموجودة. يُسمح بتعريف القوالب المتداخلة، واستخدام شروط "if" إضافية في القالب، واستخدام الأقنعة ("[x، y، *rest]")، وتعيينات المفاتيح/القيمة (على سبيل المثال، {"bandwidth": b، "latency ": l} لاستخراج قيم "النطاق الترددي" و"زمن الوصول" والقاموس)، واستخراج القوالب الفرعية (:=" عامل التشغيل)، واستخدام الثوابت المسماة في القالب. في الفصول الدراسية، من الممكن تخصيص سلوك المطابقة باستخدام طريقة "__match__()".

من فئات البيانات استيراد فئة البيانات

@dataclass
نقطة الفئة:
س:كثافة العمليات
ذ:كثافة العمليات

بالتأكيد حيث (نقطة):
نقطة تلاقي:
نقطة الحالة (0، 0):
طباعة ("الأصل")
نقطة الحالة (0، ص):
طباعة (و"ص={ص}")
نقطة الحالة (س، 0):
طباعة (و"X={x}")
نقطة الحالة ():
طباعة ("في مكان آخر")
قضية _:
طباعة ("ليست نقطة")

نقطة تلاقي:
نقطة الحالة (x، y) إذا كانت x == y:
طباعة (f"Y=X في {x}")
نقطة الحالة (س، ص):
طباعة (و"ليس على القطر")

الأحمر، الأخضر، الأزرق = 0، 1، 2
تتطابق اللون:
حالة.أحمر:
طباعة ("أرى اللون الأحمر!")
حالة.الأخضر:
طباعة ("العشب أخضر")
حالة .BLU
E:
طباعة ("أشعر بالكآبة :(")

تم إعداد مجموعة للمراجعة بقع مع التجريبية التنفيذ المواصفات المقترحة، ولكن النسخة النهائية لا تزال ناقش. على سبيل المثال تقدم بدلاً من التعبير "case _:" للقيمة الافتراضية، استخدم الكلمة الأساسية "else:" أو "default:"، حيث يتم استخدام "_" في سياقات أخرى كمتغير مؤقت. من المشكوك فيه أيضًا التنظيم الداخلي، الذي يعتمد على ترجمة التعبيرات الجديدة إلى كود ثانوي مشابه لتلك المستخدمة في بنيات "if ... elif ... else"، والتي لن توفر الأداء المطلوب عند معالجة مجموعات كبيرة جدًا من المقارنات.

المصدر: opennet.ru

إضافة تعليق