2019 októberében a Python 3.8 bevezette a Walrus operátort (:=) keresztül PEP 572 – és ezzel kiváltotta a programozási nyelvek történetének egyik legnagyobb vitáját. A vita olyan elkeseredett volt, hogy a Python feltalálója Guido van Rossum 2018 júliusában – még a megjelenése előtt – BDFL-ként betöltött pozícióját (Jóindulatú Diktátor Egy Életre). 2019 eleje óta a Pythont egy választott Irányító Tanács irányítja.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Az irányítási szakadék közvetlenül a Walrus-vita után merült fel – ez egy ritka eset volt, amikor egyetlen nyelvi jellemzőnek strukturális következményei voltak. Nyilatkozatában van Rossum kifejtette: „Az utolsó csepp a pohárban egy nagyon vitatott Python fejlesztési javaslat volt. Miután elfogadtam, az emberek a közösségi médiában, például a Twitteren, olyan dolgokat mondtak, amelyek személyesen megbántottak.”
Így folytatta: „Most, hogy a PEP 572 véget ért, soha többé nem akarok ennyire keményen harcolni egy PEP-ért, és azt tapasztalni, hogy ennyi ember utálja a döntéseimet. Teljesen ki akarom vonni magam a döntéshozatali folyamatból.” A kritika nemcsak a tágabb közösségből, hanem a fő fejlesztőktől is érkezett.
Azt állították, hogy az operátor ellentmond a Python Zenjének alapvető Python-elveinek – különösen az egyszerűségnek a bonyolultsággal szembeni előnyben részesítésének. Miután közel három évtizedet töltöttünk be vitathatatlan nyelvtervezőként, ez egy korszak végét jelentette. De miközben a Pythonnak be kellett vezetnie egy új Walrus operátort, megosztva ezzel a közösségét, felmerül a kérdés: Hogyan kezelik más nyelvek a hasonló fogalmakat?
A Python operátor := (Az értékadó kifejezés alias "Walrus") nem létezik PHP-ben – mert nincs rá szükség. A PHP-ben az értékadó operátor = mindig Kijelentés és kifejezés egyszerre: Egy értékadás visszaadja a hozzárendelt értéket. Pontosan ezért működnek az olyan idiomatikus minták, mint az „hozzárendelés és tesztelés” if-saját nyelvi jellemző nélküli feltételek.
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() a jobb oldalhoz rendeli és értékeli ki. Ha ez „igaz”, akkor beírja a if-Blokk. Háttér: Pythonban, := (PEP 572) mivel az egyszerű értékadások nem kifejezések. A PHP-ben ez mindig is más volt, tehát nincs rájuk egyenértékű igény. Két dolog vezet gyakran hibákhoz.: = Az (értékhozzárendelés) alacsonyabb precedenciával rendelkezik, mint a legtöbb relációs operátor; a zárójelek határozzák meg a kiértékelést.
Összetettebb kifejezésekben mindig zárójeleket kell használni az olvashatóság és az érthetőség javítása érdekében. ?? saját, meglehetősen alacsony prioritással rendelkezik. Ez magyarázza a meglepetéseket az olyan kifejezésekben, mint $x ?? null === null. Zárójelek nélkül, először is null === null értékelni. Jobb mindig explicit zárójelbe tenni: ($x ?? null) === null. $a kívül is létezik if-Blokkok – esetleg hamis értékkel.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Tehát egyértelmű, hogy === 'bar' alkalmazva van a hozzárendelt értékre. A zárójelek itt fontosak az olvashatóság és a prioritás miatt. A gyakorlatban ez a minta elkerüli a felesleges ismétlődő hívásokat (pl. a lekérdezésszerkesztőét) azáltal, hogy tárolja a lekérdezés eredményét, majd ellenőrzi azt. Produktív alkalmazásokban, például a Laravel-alapú projektekben a következő minta gyakrabban figyelhető meg.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& rövidzárlatos: A jobb oldali rész csak akkor értékelődik ki, ha a bal oldali rész igaz. Az utasítás upstream értékadásával elkerülhető, hogy az utasítás az if utasításon kívül kerüljön értékadásra. Hogy ez jó gyakorlat-e, az a csapatod kódjától és elemzőeszközeitől függ; szemantikailag helyes. Legalább tudnod kell, mit csinál a kód, ha a vadonban találkozol vele.
A PHP-nek nincs szüksége „Walrus operátorra”, mivel az értékadások már eleve kifejezések. Ez lehetővé teszi az olyan idiomatikus mintákat, mint az „értékhozzárendelés és tesztelés” – hatékonyak és tömörek. Ugyanakkor a fegyelem iránti követelmények is növekednek: a zárójelek használata, a szigorú összehasonlítások, az igaz/hamis megkülönböztetés tudatosítása és az egyértelmű csapatkonvenciók kötelezőek. Azok, akik követik ezeket az irányelveket, további nyelvi funkció nélkül is élvezhetik a Walrus ötlet előnyeit.