single operator one else assignment python variable-assignment ternary-operator user-friendly

operator - simplify if else python



Compresión de la instrucción `x if x else y` en Python (2)

Estoy bastante familiarizado con el enfoque del operador ternario de Python:

value = foo if something else bar

Mi pregunta es muy simple: sin asignaciones previas, ¿hay alguna referencia al término que se está evaluando en ( if ... ) de uno de los operandos de retorno ( ... if o else ... )?

La motivación aquí es que a veces uso expresiones en if ... eso es exactamente lo que me gustaría tener como resultado en la operación ternaria; Sin embargo, sucede que, para expresiones pequeñas, no hay problema en repetirlo, pero para expresiones un poco más largas, es algo desagradable. Toma esto como un ejemplo:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"


No hay manera de hacer esto, y eso es intencional. El ternario solo se supone para ser usado en casos triviales.

Si desea utilizar el resultado de un cálculo dos veces, colóquelo en una variable temporal:

value = info.findNext("b") value = value if value else "Oompa Loompa"

Una vez que haces esto, queda claro que estás haciendo algo tonto, y de hecho, la forma pitónica de escribir esto es:

value = info.findNext("b") if not value: value = "Oompa Loompa"

Y eso es en realidad 5 pulsaciones menos que tu intento original.

Si realmente desea guardar las pulsaciones de teclado, puede hacer esto:

value = info.findNext("b") or "Oompa Loompa"

Pero eso es desalentado por muchas guías de estilo, y por el BDFL.

Si solo haces esto una vez, es mejor ser más explícito. Si lo hace media docena de veces, es trivial, y mucho mejor, hacer que findNext adopte un valor predeterminado opcional para regresar en lugar de None , al igual que todas las funciones incorporadas y stdlib:

def findNext(self, needle, defvalue=None): # same code as before, but instead of return None or falling off the end, # just return defvalue.

Entonces puedes hacer esto:

value = info.findNext("b", "Oompa Loompa")


No lo use if ... else . En su lugar, aproveche los operadores coalescentes de Python.

value = info.findNext("b") or "Oompa Loompa"