في أكتوبر 2019، قدم Python 3.8 عامل Walrus (:=) عبر بيب 572 - مما أثار أحد أكبر الجدل في تاريخ لغة البرمجة. كان الجدل حادًا لدرجة أن مخترع بايثون غيدو فان روسوم في يوليو 2018 - حتى قبل الإصدار - منصبه كـ BDFL (دكتاتور خير مدى الحياة). منذ بداية عام 2019، أصبحت Python خاضعة لإدارة مجلس توجيهي منتخب.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
نشأ الخلاف في الحوكمة فورًا عقب مناقشة والرس - وهي حالة نادرة كان فيها لخاصية لغة واحدة عواقب هيكلية. في بيانه، أوضح فان روسوم: "كانت القشة التي قصمت ظهر البعير اقتراحًا مثيرًا للجدل للغاية لتحسين بايثون. بعد قبولي له، لجأ الناس إلى وسائل التواصل الاجتماعي مثل تويتر وتحدثوا بعبارات أساءت إليّ شخصيًا".
وتابع: "الآن وقد انتهى برنامج PEP 572، لا أريد أن أضطر إلى النضال بشراسة من أجل برنامج PEP مرة أخرى، وأجد الكثير من الناس يكرهون قراراتي. أريد أن أبتعد تمامًا عن عملية صنع القرار." لم تأتِ الانتقادات من مجتمع المطورين الأوسع فحسب، بل من المطورين الأساسيين أيضًا.
جادلوا بأن المُشغِّل يتناقض مع مبادئ بايثون الأساسية من فلسفة بايثون ، وخاصةً تفضيل البساطة على التعقيد. بعد ما يقرب من ثلاثة عقود من كونها مُصممة اللغة بلا منازع، مثّل هذا نهاية حقبة. ولكن بينما اضطرت بايثون إلى طرح مُشغِّل Walrus جديد، مما أدى إلى انقسام مجتمعها، يُطرح السؤال: كيف تتعامل اللغات الأخرى مع مفاهيم مُماثلة؟
عامل بايثون := (تعبير التعيين، المعروف أيضًا باسم "Walrus") غير موجود في PHP، لعدم الحاجة إليه. في PHP، عامل التعيين = دائماً بيان وتعبير في نفس الوقت: يُرجع التعيين القيمة المُخصصة. وهذا تحديدًا سبب نجاح الأنماط الاصطلاحية مثل "التعيين والاختبار" في if-الشروط التي لا تحتوي على ميزة لغوية خاصة بها.
function get_some_field() {
return 'foo';
}
if ($a = get_some_field()) {
echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.
$a = get_some_field() يُعيِّن ويُقيِّم على الجانب الأيمن. إذا كان هذا "صحيحًا"، فأدخل if-كتلة. الخلفية: في بايثون، := (PEP 572) لأن التعيينات البسيطة ليست تعبيرات. في PHP، كان هذا الأمر مختلفًا دائمًا، لذا لا توجد حاجة مماثلة. غالبًا ما يؤدي أمران إلى أخطاء.: = (التعيين) له أولوية أقل من معظم مشغلي العلاقات؛ تحدد الأقواس التقييم.
في التعبيرات الأكثر تعقيدًا، يجب عليك دائمًا استخدام الأقواس لزيادة إمكانية القراءة والوضوح. ?? له أولوية خاصة به، وإن كانت منخفضة نوعًا ما. وهذا يفسر المفاجآت في تعبيرات مثل $x ?? null === null. بدون أقواس، أولاً null === null تم تقييمه. من الأفضل دائمًا وضع أقواس واضحة: ($x ?? null) === null. $a يوجد أيضًا خارج if-الكتل - ربما بقيمة خاطئة.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
فمن الواضح إذن أن === 'bar' يُطبّق على القيمة المُخصّصة. الأقواس مهمة هنا لسهولة القراءة والأولوية. عمليًا، يُجنّب هذا النمط الاستدعاءات المُكرّرة غير الضرورية (مثل استدعاءات مُنشئ الاستعلامات) عن طريق تخزين نتيجة الاستعلام ثمّ التحقق منها. في التطبيقات الإنتاجية، مثل المشاريع القائمة على Laravel، يُمكن ملاحظة النمط التالي بشكل أكثر تكرارًا.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& يُسبب قصرًا في الدائرة: يُقيّم الجزء الأيمن فقط إذا كان الجزء الأيسر صحيحًا. بتعيين العبارة في المنبع، تتجنب تعيين العبارة خارج جملة الشرط. يعتمد مدى صحة هذه الممارسة على شيفرة فريقك وأدوات التحليل؛ فهي صحيحة دلاليًا. على الأقل، يجب أن تعرف ما يفعله الشيفرة إذا واجهتها في الواقع.
لا تحتاج لغة PHP إلى "معامل Walrus" لأن التعيينات هي تعبيرات بالفعل. هذا يُتيح أنماطًا اصطلاحية مثل "التعيين والاختبار" - فعّالة وموجزة. في الوقت نفسه، تزداد متطلبات الانضباط: فالأقواس، والمقارنات الدقيقة، والوعي بالصواب والخطأ، واتفاقيات الفريق الواضحة أمورٌ إلزامية. من يتبع هذه الإرشادات يجني ثمار فكرة Walrus دون الحاجة إلى ميزة لغوية إضافية.