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"