Ing Oktober 2019, Python 3.8 ngenalake operator Walrus (:=) liwat PEP 572 - lan kanthi mangkono micu salah sawijining kontroversi paling gedhe ing sejarah basa pamrograman. Debat dadi pait sing penemu Python Guido van Rossum ing Juli 2018 - malah sadurunge release - posisi minangka BDFL (Diktator Benevolent Kanggo Urip). Wiwit wiwitan taun 2019, Python wis diatur dening Dewan Kemudi sing dipilih.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
Retak pamrentahan muncul langsung sawise diskusi Walrus-kasus langka ing ngendi fitur basa siji duwe akibat struktural. Ing pratelan kasebut, van Rossum nerangake: "Ing jerami pungkasan minangka Proposal Enhancement Python sing kontroversial banget. Sawise aku nampa, wong njupuk menyang media sosial kaya Twitter lan ngandika bab sing babras kula pribadi."
Dheweke terus: "Saiki PEP 572 wis rampung, aku ora pengin kudu berjuang keras maneh kanggo PEP lan nemokake manawa akeh wong sing ora seneng karo keputusanku. Aku pengin mbusak kabeh saka proses nggawe keputusan." Kritik kasebut ora mung saka komunitas sing luwih akeh, nanging uga saka pangembang inti.
Dheweke ujar manawa operator kasebut mbantah prinsip Python dhasar saka Zen of Python - utamane pilihan kanggo kesederhanaan tinimbang kerumitan. Sawise meh telung puluh taun dadi desainer basa sing ora bisa dibantah, iki nandhani pungkasane jaman. Nanging nalika Python kudu ngenalake operator Walrus anyar, mbagi komunitas ing proses kasebut, pitakonan muncul: Kepiye basa liya nangani konsep sing padha?
Operator Python := (Ekspresi Tugas alias "Walrus") ora ana ing PHP – amarga ora dibutuhake. Ing PHP, operator assignment = tansah Pernyataan lan ekspresi ing wektu sing padha: Tugas ngasilake nilai sing ditugasake. Iki sebabe pola idiomatik kaya "assign-and-test" bisa digunakake if-kahanan tanpa fitur basa dhewe.
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() nemtokake lan ngevaluasi ing sisih tengen. Yen iki "bener", sampeyan ngetik if-Blok. Latar mburi: Ing Python, := (PEP 572) amarga tugas sing prasaja dudu ekspresi. Ing PHP, iki mesthi beda, mula ora ana kabutuhan sing padha. Loro perkara asring nyebabake kewan omo.: = (Assignment) nduweni precedence luwih murah tinimbang operator relasional; kurung nemtokake evaluasi.
Ing ekspresi sing luwih rumit, sampeyan kudu nggunakake tanda kurung kanggo nambah keterbacaan lan kejelasan. ?? wis dhewe, rada kurang prioritas. Iki nerangake kejutan ing ekspresi kaya $x ?? null === null. Tanpa tanda kurung, dhisik null === null dievaluasi. Iku luwih apik kanggo tansah tegas bracket: ($x ?? null) === null. $a uga ana ing njaba if-Blocks - bisa karo nilai palsu.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Dadi cetha yen === 'bar' ditrapake kanggo nilai sing diwenehake. Kurung penting ing kene kanggo maca lan prioritas. Ing laku, pola iki ngindhari telpon duplikat sing ora perlu (contone, saka pembangun pitakon) kanthi nyimpen asil pitakon banjur mriksa. Ing aplikasi produktif, kayata proyek basis Laravel, pola ing ngisor iki bisa diamati luwih kerep.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& short-circuiting: Sisih tengen mung dievaluasi yen sisih kiwa bener. Kanthi menehi statement ing hulu, sampeyan ora nemtokake statement ing njaba pernyataan yen. Apa praktik sing apik iki gumantung marang kode lan alat analisis tim sampeyan; semantically, iku bener. Paling ora, sampeyan kudu ngerti apa kode kasebut yen sampeyan nemoni ing alam bébas.
PHP ora mbutuhake "operator Walrus" amarga tugas wis ekspresi. Iki ndadekake pola idiomatik kaya "assign-and-test" bisa - performa lan ringkes. Ing wektu sing padha, tuntutan kanggo nambah disiplin: kurung, mbandhingake ketat, kesadaran bebener / palsu, lan konvensi tim sing jelas wajib. Wong-wong sing ngetutake pedoman kasebut entuk manfaat saka gagasan Walrus tanpa mbutuhake fitur basa tambahan.