¿Cómo puedo lograrlo de cerca?: Desde C ++ / C # en Python?
-
02-07-2019 - |
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'?
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
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,
- ¿Python tiene un operador condicional ternario?
- ¿Cuál es la mejor manera de reemplazar el operador ternario en Python?
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 ...