2019 թվականի հոկտեմբերին Python 3.8-ը ներկայացրեց Walrus օպերատորը (:=) միջոցով ՊԵՊ 572 – և դրանով իսկ առաջացրեց ծրագրավորման լեզվի պատմության մեջ ամենամեծ վեճերից մեկը։ Բանավեճն այնքան դաժան էր, որ Python-ի գյուտարարը Գուիդո վան Ռոսում 2018 թվականի հուլիսին՝ նույնիսկ թողարկումից առաջ՝ նրա BDFL-ի պաշտոնը (Բարեգործ դիկտատոր ողջ կյանքի համար)։ 2019 թվականի սկզբից Python-ը կառավարվում է ընտրված ղեկավար խորհրդի կողմից։
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Կառավարման վեճը ծագեց անմիջապես Walrus-ի քննարկումից հետո՝ հազվագյուտ դեպք, երբ մեկ լեզվական առանձնահատկությունն ունեցավ կառուցվածքային հետևանքներ։ Իր հայտարարության մեջ վան Ռոսումը բացատրեց. «Վերջին կաթիլը Python-ի բարելավման շատ վիճահարույց առաջարկն էր։ Այն բանից հետո, երբ ես ընդունեցի այն, մարդիկ սկսեցին սոցիալական ցանցերում, ինչպիսին է Twitter-ը, ասել այնպիսի բաներ, որոնք ինձ անձամբ վիրավորեցին»։
Նա շարունակեց. «Հիմա, երբ PEP 572-ն ավարտվեց, ես երբեք չեմ ուզում կրկին այդքան պայքարել PEP-ի համար և պարզել, որ այդքան շատ մարդիկ ատում են իմ որոշումները: Ես ուզում եմ լիովին հեռանալ որոշումների կայացման գործընթացից»: Քննադատությունը հնչեց ոչ միայն ավելի լայն համայնքի, այլև հիմնական մշակողների կողմից:
Նրանք պնդում էին, որ օպերատորը հակասում է Python- ի Zen-ի հիմնարար սկզբունքներին, մասնավորապես՝ պարզությանը բարդության նկատմամբ նախապատվություն տալուն։ Գրեթե երեք տասնամյակ որպես անվիճելի լեզվի նախագծող աշխատելուց հետո սա նշանավորեց մի դարաշրջանի ավարտը։ Սակայն, մինչ Python-ը ստիպված էր ներմուծել նոր Walrus օպերատոր, որի արդյունքում բաժանվեց իր համայնքը, հարց է առաջանում. ինչպե՞ս են այլ լեզուները կարգավորում նմանատիպ հասկացությունները։
Python օպերատորը := (Հանձնարարական արտահայտություն՝ «Ծովացուլ») 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-Բլոկ։ Նախապատմություն՝ Python-ում, := (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());
}
&& կարճ միացում է. Աջ մասը գնահատվում է միայն այն դեպքում, եթե ձախ մասը ճշմարիտ է: Վերևում նշված արտահայտությունը վերագրելով՝ դուք խուսափում եք if հայտարարությունը վերագրելուց: Սա լավ պրակտիկա է, թե ոչ, կախված է ձեր թիմի կոդից և վերլուծության գործիքներից. իմաստաբանական առումով այն ճիշտ է: Առնվազն, դուք պետք է իմանաք, թե ինչ է անում կոդը, եթե այն հանդիպեք անկանոն եղանակով:
PHP-ն «Ծովացուլ օպերատորի» կարիք չունի, քանի որ վերագրումներն արդեն իսկ արտահայտություններ են։ Սա հնարավոր է դարձնում այնպիսի իդիոմատիկ օրինաչափություններ, ինչպիսին է «վերագրել և ստուգել»-ը՝ արդյունավետ և հակիրճ։ Միևնույն ժամանակ, կարգապահության պահանջները մեծանում են. պարտադիր են փակագծերը, խիստ համեմատությունները, ճշմարտացիության/կեղծիքի գիտակցումը և թիմային հստակ կոնվենցիաները։ Նրանք, ովքեր հետևում են այս ուղեցույցներին, օգտվում են Ծովացուլ գաղափարի առավելություններից՝ առանց լրացուցիչ լեզվական գործառույթի անհրաժեշտության։