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 .
El Capítulo 4 de diveintopython.net tiene la respuesta. Se llama and y o truco en Python.
Hay algunos duplicados de esta pregunta, por ejemplo
- ¿Python tiene un operador condicional ternario?
- ¿Cuál es la mejor manera de reemplazar el operador ternario en Python?
En esencia, en un entorno general, el código pre-2.5 debería usar esto:
(condExp and [thenExp] or [elseExp])[0]
(dado condExp, thenExp y elseExp son expresiones arbitrarias), ya que evita los resultados incorrectos si thenExp evalúa a boolean False, mientras se mantiene la evaluación de cortocircuito.