Në tetor 2019, Python 3.8 prezantoi operatorin Walrus (:=) nëpërmjet PEP 572 – dhe kështu shkaktoi një nga polemikat më të mëdha në historinë e gjuhës së programimit. Debati ishte aq i ashpër sa shpikësi i Python Guido van Rossum në korrik 2018 – madje edhe para publikimit – pozicioni i tij si BDFL (Diktator Bamirës Për JetëQë nga fillimi i vitit 2019, Python është qeverisur nga një Këshill Drejtues i zgjedhur.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Përçarja në qeverisje lindi menjëherë pas diskutimit për Walrus - një rast i rrallë në të cilin një veçori e vetme gjuhësore pati pasoja strukturore. Në deklaratën e tij, van Rossum shpjegoi: "Gjëja që piu ishte një Propozim shumë i diskutueshëm për Përmirësimin e Python. Pasi e pranova, njerëzit përdorën mediat sociale si Twitter dhe thanë gjëra që më lënduan personalisht."
Ai vazhdoi: "Tani që PEP 572 ka mbaruar, nuk dua kurrë më të luftoj kaq shumë për një PEP dhe të zbuloj se kaq shumë njerëz i urrejnë vendimet e mia. Dua të largohem plotësisht nga procesi i vendimmarrjes." Kritikat erdhën jo vetëm nga komuniteti i gjerë, por edhe nga zhvilluesit kryesorë.
Ata argumentuan se operatori binte ndesh me parimet themelore të Python nga Zen i Python - veçanërisht preferencën për thjeshtësi mbi kompleksitetin. Pas gati tre dekadash si projektuesi i padiskutueshëm i gjuhëve, kjo shënoi fundin e një epoke. Por, ndërsa Python duhej të prezantonte një operator të ri Walrus, duke e ndarë komunitetin e tij në këtë proces, lind pyetja: Si i trajtojnë gjuhët e tjera koncepte të ngjashme?
Operatori Python := (Shprehja e Caktimit alias "Walrus") nuk ekziston në PHP - sepse nuk është e nevojshme. Në PHP, operatori i caktimit = gjithmonë Deklaratë dhe shprehje në të njëjtën kohë: Një caktim kthen vlerën e caktuar. Pikërisht për këtë arsye funksionojnë modelet idiomatike si "cakto-dhe-testo" në if-kushte pa veçorinë e tyre gjuhësore.
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() cakton dhe vlerëson në anën e djathtë. Nëse kjo është "e vërtetë", ju futni if-Bllok. Sfondi: Në Python, := (PEP 572) sepse caktimet e thjeshta nuk janë shprehje. Në PHP, kjo ka qenë gjithmonë e ndryshme, kështu që nuk ka nevojë ekuivalente. Dy gjëra shpesh çojnë në gabime.: = (Caktimi) ka një përparësi më të ulët se shumica e operatorëve relacionalë; kllapat përcaktojnë vlerësimin.
Në shprehje më komplekse, duhet të përdorni gjithmonë kllapa për të rritur lexueshmërinë dhe qartësinë. ?? ka përparësinë e vet, mjaft të ulët. Kjo shpjegon surprizat në shprehje si $x ?? null === null. Pa kllapa, së pari null === null vlerësohet. Është më mirë të vendosni gjithmonë në mënyrë të qartë kllapa: ($x ?? null) === null. $a ekziston edhe jashtë if-Blloqe – ndoshta me një vlerë të rreme.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Pra, është e qartë se === 'bar' zbatohet në vlerën e caktuar. Kllapat janë të rëndësishme këtu për lexueshmëri dhe përparësi. Në praktikë, ky model shmang thirrjet e panevojshme të dyfishta (p.sh., të ndërtuesit të pyetjeve) duke ruajtur rezultatin e pyetjes dhe më pas duke e kontrolluar atë. Në aplikacionet produktive, siç janë projektet e bazuara në Laravel, modeli i mëposhtëm mund të vërehet më shpesh.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& është qark i shkurtër: Pjesa e djathtë vlerësohet vetëm nëse pjesa e majtë është e vërtetë. Duke i caktuar deklaratën në rrjedhën e sipërme, ju shmangni caktimin e deklaratës jashtë deklaratës if. Nëse kjo është praktikë e mirë varet nga kodi dhe mjetet e analizës së ekipit tuaj; semantikisht, është e saktë. Të paktën, duhet të dini se çfarë bën kodi nëse e hasni në mënyrë të paligjshme.
PHP nuk ka nevojë për një "operator Walrus" sepse caktimet janë tashmë shprehje. Kjo i bën të mundura modelet idiomatike si "cakto-dhe-testo" - performuese dhe koncize. Në të njëjtën kohë, kërkesat për disiplinë rriten: kllapat, krahasimet strikte, vetëdija për të vërtetën/të gabuarën dhe konventat e qarta të ekipit janë të detyrueshme. Ata që ndjekin këto udhëzime korrin përfitimet e idesë Walrus pa kërkuar një veçori shtesë gjuhësore.