المستوى: متوسط — هذا المقال يفترض إنك بتكتب Python يومياً وعندك خلفية بـ if/elif و isinstance و dataclasses. لو لسه مبتدئ، الجزء الأول بالمثال هيوصّلك للفكرة، لكن الكود في النص محتاج Python 3.10 على الأقل.
لو فاتح ملف Python فيه دالة handler طولها 90 سطر وكلها سلسلة if/elif بتفحص نوع event، كل تعديل بسيط بيكسر حاجة في مكان تاني. الـ match/case في Python 3.10+ مش syntactic sugar — هي طريقة مختلفة في التفكير، بتنزّل عدد الـ bugs من نوع "نسيت الحالة دي" لصفر تقريباً، وبتخلّي الـ code review أسرع 3 مرات.
Pattern Matching في Python: لماذا match/case ليست مجرد switch بلغة جديدة
المشكلة باختصار
تخيّل إنك بتكتب backend لخدمة اشتراكات. الـ webhook بيوصلك events متنوعة: payment_succeeded، payment_failed، subscription_renewed، trial_ended، refund_issued. كل event شكله مختلف وفيه fields مختلفة. الطريقة التقليدية: 8 أو 9 if/elif blocks متشابكة مع isinstance و .get() ومحاولات استخراج fields من dicts متداخلة. النتيجة: 90 سطر كود، 4 bugs في الإنتاج كل أسبوع لمّا يضيف الفريق event جديد وينسى يحدّث الـ handler.
المفهوم بمثال بسيط (للمبتدئ)
افتكر مكتب الجوازات في المطار. الموظف بياخد الجواز ويبص عليه نظرة سريعة. لو غلاف أحمر مصري، بيبعتك للطابور A. لو أزرق سعودي، طابور B. لو في رمز خاص لزائر دبلوماسي، طابور C على طول من غير ما يقرا الصفحات. الموظف ما بيقفش يقرا كل صفحة جواز عشان يقرر — هو بيطابق الـ pattern (اللون + الرمز) ويوزّع.
ده بالظبط اللي بيعمله match/case في Python: بياخد قيمة (subject)، بيقارنها مع أنماط محددة (patterns) واحد ورا التاني، وبينفّذ أول فرع نجح في المطابقة. الفرق عن switch في لغات تانية إن match مش بيقارن قيمة بقيمة بس — هو بيقدر يطابق structure كاملة (دي كائن من نوع كذا فيه field اسمه كذا قيمته أكبر من كذا).
التعريف العلمي الدقيق
Pattern Matching دخل Python في الإصدار 3.10 عبر PEP 634 (Structural Pattern Matching: Specification). الكلمة المفتاحية match بتاخد قيمة (subject)، وكل case بتعرّف نمطًا للمطابقة. لو النمط نجح، يتم تنفيذ block الكود + bind للمتغيرات المستخرجة من النمط. الأنماط المدعومة رسمياً:
- Literal patterns: قيم ثابتة مثل
1،"x"،None. - Capture patterns: متغير بياخد القيمة، مثل
case x. - Class patterns: مطابقة على نوع الكائن واستخراج fields، مثل
Point(x=0, y=y). - Sequence patterns: مطابقة list/tuple مع unpacking، مثل
[first, *rest]. - Mapping patterns: مطابقة dict على keys محددة، مثل .