usar ejecutar python syntax ternary-operator syntax-rules

ejecutar - ¿Cómo puedo lograrlo de cerca ?: ¿C++/C#en Python?



ejecutar c en python (9)

@Dan

if otherString: stringValue = otherString else: stringValue = defaultString

Este tipo de código es más largo y más expresivo, pero también más legible

Bueno, sí, es más largo. No estoy tan seguro de "más expresivo" y "más legible". Por lo menos, su reclamo es discutible. Incluso llegaría a decir que es francamente erróneo, por dos razones.

Primero, su código enfatiza la toma de decisiones (bastante extremadamente). Por otro lado, el operador condicional enfatiza otra cosa, a saber, el valor (o la asignación de dicho valor). Y esto es exactamente lo que quiere el escritor de este código. La toma de decisiones es más bien un subproducto del código. La parte importante aquí es la operación de asignación. Su código oculta esta tarea en un montón de ruido sintáctico: la ramificación.

Su código es menos expresivo porque cambia el énfasis de la parte importante.

Incluso entonces su código probablemente triunfaría sobre algún arte ASCII oscuro como ?: . Un en línea, if sería preferible. Personalmente, no me gusta la variante presentada con Python 2.5 porque está al revés. Preferiría algo que se lea en el mismo flujo (dirección) que el operador de C ternario, pero usa palabras en vez de caracteres ASCII:

C = if cond then A else B

Esto gana indiscutiblemente.

C y C # desafortunadamente no tienen una declaración tan expresiva. Pero (y este es el segundo argumento), el operador condicional ternario de las lenguas C está tan arraigado que se ha convertido en un modismo en sí mismo. El operador ternario es tan parte del lenguaje como la declaración if "convencional". Debido a que es una expresión idiomática, cualquiera que conozca el idioma inmediatamente lee este código correctamente. Además, es una forma extremadamente corta y concisa de expresar estas semánticas. De hecho, es la forma más corta imaginable. Es extremadamente expresivo porque no oscurece la esencia con ruido innecesario.

Finalmente, Jeff Atwood ha escrito la conclusión perfecta para esto: el mejor código es ningún código en absoluto .

En C # podría escribir fácilmente lo siguiente:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

¿Hay una manera rápida de hacer lo mismo en Python o me quedo con una declaración ''if''?


En Python 2.5, hay

A if C else B

que se parece mucho?: en C. Sin embargo, está mal visto por dos razones: legibilidad, y el hecho de que generalmente hay una manera más simple de abordar el problema. Por ejemplo, en tu caso:

stringValue = otherString or defaultString


Nunca es malo escribir un código expresivo y legible.

if otherString: stringValue = otherString else: stringValue = defaultString

Este tipo de código es más largo y más expresivo, pero también más legible y menos propenso a tropezarse o modificarse en el futuro. No tengas miedo de escribir expresivamente: el código legible debe ser un objetivo, no un subproducto.


Por cierto, j0rd4n, no escribes (¡ por favor no lo hagas!) En C #. Aparte del hecho de que el IsDefaultOrNull se llama realmente IsNullOrEmpty , esto es pura IsNullOrEmpty código. C # ofrece el operador de coalescencia para situaciones como estas:

string stringValue = otherString ?? defaultString;

Es cierto que esto solo funciona si otherString es null (en lugar de estar vacío), pero si esto se puede garantizar de antemano (y a menudo puede hacerlo), hace que el código sea mucho más legible.


Puede aprovechar el hecho de que las expresiones lógicas devuelven su valor, y no solo el estado verdadero o falso. Por ejemplo, siempre puedes usar:

result = question and firstanswer or secondanswer

Con la advertencia de que no funciona como el operador ternario si primero es falso. Esto se debe a que la pregunta se evalúa primero, suponiendo que es verdadera primero se devuelve a menos que primero sea falsa, por lo que este uso no actúa como el operador ternario. Sin embargo, si conoce los valores, generalmente no hay problema. Un ejemplo sería:

result = choice == 7 and "Seven" or "Another Choice"


Si usaste ruby, podrías escribir

stringValue = otherString.blank? ? defaultString : otherString;

el construido en blank? método significa nulo o vacío.
Acércate al lado oscuro ...


También descubrí que usar el operador "o" funciona bastante bien. Por ejemplo:

finalString = get_override() or defaultString

Si get_override () devuelve "" o None, siempre usará defaultString .