Pregunta

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

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

¿Hay una forma rápida de hacer lo mismo en Python o estoy atascado con una declaración de 'si'?

¿Fue útil?

Solución

En Python 2.5, hay

A if C else B

¿Cuál es el comportamiento de?: en C. Sin embargo, está mal visto por dos razones: la legibilidad y el hecho de que generalmente hay una forma más sencilla de abordar el problema. Por ejemplo, en su caso:

stringValue = otherString or defaultString

Otros consejos

@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 reclamación es discutible. Incluso me atrevería a decir que está totalmente equivocado, por dos razones.

Primero, su código enfatiza la toma de decisiones (más bien extremadamente). Por otro lado, el operador condicional enfatiza algo más, a saber, el valor (resp. La asignación de dicho valor). Y esto es exactamente lo que quiere el autor 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 asignación en mucho 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 un arte ASCII oscuro como ?: . Un en línea si sería preferible. Personalmente, no me gusta la variante introducida con Python 2.5 porque está al revés. Preferiría algo que se lea en el mismo flujo (dirección) que el operador ternario de C pero use palabras en lugar de caracteres ASCII:

C = if cond then A else B

Esto gana sin duda.

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

Finalmente, Jeff Atwood ha escrito la conclusión perfecta para esto: El mejor código no hay ningún código .

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 es más legible y menos probable que se salte o se edite incorrectamente en el futuro. No tenga miedo de escribir expresamente: el código legible debe ser un objetivo, no un subproducto.

Hay algunos duplicados de esta pregunta, por ejemplo,

En esencia, en una configuración general, el código pre-2.5 debe usar esto:

 (condExp and [thenExp] or [elseExp])[0]

(dado condExp, thenExp y elseExp son expresiones arbitrarias), ya que evita resultados erróneos si thenExp se evalúa como Falso booleano, al tiempo que mantiene la evaluación de cortocircuito.

Por cierto, j0rd4n, usted no ( por favor ¡no!) escriba código como este en C #. Aparte del hecho de que IsDefaultOrNull en realidad se llama IsNullOrEmpty , esto es un código puro. 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 vacío) pero si esto se puede asegurar de antemano (y con frecuencia puede) el código es muy importante más legible.

También descubrí que simplemente usando " o " operador hace bastante bien Por ejemplo:

finalString = get_override() or defaultString

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

El Capítulo 4 de diveintopython.net tiene la respuesta. Se llama the and or trick en Python.

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 la primera respuesta es falsa. Esto se debe a que la pregunta se evalúa primero, asumiendo que es verdadera la primera respuesta se devuelve a menos que la primera respuesta 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 rubí, podrías escribir

stringValue = otherString.blank? ? defaultString : otherString;

el método integrado en blank? significa nulo o vacío.
Ven al lado oscuro ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top