En octubre de 2019, Python 3.8 introdujo el operador Walrus (:=) a través de PEP 572 – y con ello desencadenó una de las mayores controversias en la historia del lenguaje de programación. El debate fue tan agrio que el inventor de Python... Guido van Rossum En julio de 2018, incluso antes de su liberación, su puesto como BDFL (Dictador benevolente vitalicio). Desde principios de 2019, Python ha sido gobernado por un Consejo Directivo elegido.
if (n := len(items)) > 10:
print(f"List is too long ({n} elements)")
La división en la gobernanza surgió inmediatamente después del debate sobre Walrus, un caso inusual en el que una sola característica del lenguaje tuvo consecuencias estructurales. En su declaración, van Rossum explicó: «La gota que colmó el vaso fue una propuesta de mejora de Python muy controvertida. Tras aceptarla, la gente recurrió a redes sociales como Twitter y dijo cosas que me perjudicaron personalmente».
Continuó: «Ahora que el PEP 572 ha terminado, no quiero volver a tener que luchar tanto por un PEP y descubrir que tanta gente detesta mis decisiones. Quiero retirarme por completo del proceso de toma de decisiones». Las críticas no solo vinieron de la comunidad en general, sino también de los desarrolladores principales.
Argumentaron que el operador contradecía los principios fundamentales de Python, provenientes del Zen de Python , en particular la preferencia por la simplicidad sobre la complejidad. Tras casi tres décadas como el diseñador indiscutible del lenguaje, esto marcó el fin de una era. Pero mientras Python tuvo que introducir un nuevo operador, Walrus, dividiendo a su comunidad en el proceso, surge la pregunta: ¿Cómo gestionan otros lenguajes conceptos similares?
El operador de Python := (La expresión de asignación alias "Walrus") no existe en PHP porque no es necesaria. En PHP, el operador de asignación... = siempre Declaración y expresión al mismo tiempo: Una asignación devuelve el valor asignado. Precisamente por eso funcionan patrones idiomáticos como "asignar y probar" en if-condiciones sin característica lingüística propia.
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() asigna y evalúa al lado derecho. Si es "verdadero", se ingresa el if-Bloque. Antecedentes: En Python, := (PEP 572) porque las asignaciones simples no son expresiones. En PHP, esto siempre ha sido diferente, por lo que no existe una necesidad equivalente. Dos factores suelen provocar errores.: = (Asignación) tiene una precedencia menor que la mayoría de los operadores relacionales; los paréntesis determinan la evaluación.
En expresiones más complejas, siempre se deben utilizar paréntesis para aumentar la legibilidad y la claridad. ?? tiene su propia prioridad, bastante baja. Esto explica las sorpresas en expresiones como $x ?? null === null. Sin paréntesis, primero null === null evaluado. Es mejor siempre poner entre paréntesis explícitamente: ($x ?? null) === null. $a También existe fuera de la if-Bloques – posiblemente con un valor falso.
function get_some_field() {
return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
echo $a; // bar
}
Así que está claro que === 'bar' Se aplica al valor asignado. Los corchetes son importantes para facilitar la lectura y la prioridad. En la práctica, este patrón evita llamadas duplicadas innecesarias (por ejemplo, del constructor de consultas) al almacenar el resultado de la consulta y luego comprobarlo. En aplicaciones productivas, como los proyectos basados en Laravel, el siguiente patrón se observa con mayor frecuencia.:
if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
dd($foo->get());
}
&& Cortocircuito: La parte derecha solo se evalúa si la izquierda es verdadera. Al asignar la sentencia en sentido ascendente, se evita asignar la sentencia fuera de la sentencia if. Que esto sea una buena práctica depende del código y las herramientas de análisis de tu equipo; semánticamente, es correcto. Como mínimo, deberías saber qué hace el código si lo encuentras en la práctica.
PHP no necesita un "operador Walrus" porque las asignaciones ya son expresiones. Esto posibilita patrones idiomáticos como "asignar y probar", eficientes y concisos. Al mismo tiempo, aumentan las exigencias de disciplina: se requieren paréntesis, comparaciones estrictas, reconocimiento de la verdad y la falsedad, y convenciones claras de equipo. Quienes siguen estas pautas se benefician de la idea de Walrus sin necesidad de una función adicional del lenguaje.