В октябре 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, изложенным в «Дзене Python» , в частности, предпочтению простоты сложности. После почти трёх десятилетий бесспорного лидерства в качестве создателя языка это ознаменовало конец целой эпохи. Однако, хотя Python пришлось ввести новый оператор Walrus, что привело к расколу сообщества, возникает вопрос: как другие языки обрабатывают подобные концепции?
Оператор Python := (псевдоним выражения присваивания "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-Блок. Предыстория: В 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 не нужен «оператор Walrus», поскольку присваивания уже являются выражениями. Это делает возможными идиоматические шаблоны вроде «присвоить и проверить» — производительные и лаконичные. В то же время требования к дисциплине возрастают: обязательны скобки, строгие сравнения, понимание истинности/ложности и чёткие соглашения в команде. Те, кто следует этим рекомендациям, пожинают плоды идеи Walrus, не требуя дополнительных языковых возможностей.