Este es un problema que se me ocurrió mientras trabajaba en un proyecto de Django. Se trata de la validación de formularios.Python: Evite la evaluación de cortocircuitos
En Django, cuando tiene un formulario enviado, puede llamar al is_valid()
en el objeto de formulario correspondiente para activar la validación y devolver un valor booleano. Así que, por lo general tiene código de esa manera dentro de sus funciones de vista:
if form.is_valid():
# code to save the form data
is_valid()
no sólo valida los datos del formulario, pero también añade mensajes de error para el objeto de formulario que luego se pueden mostrar al usuario.
En una página utilizo dos formularios juntos y también deseo que los datos se guarden solo si ambos formularios contienen datos válidos. Eso significa que tengo que llamar a is_valid() en ambos formularios antes de ejecutar el código para guardar los datos. La forma más obvia:
if form1.is_valid() and form2.is_valid():
# ...
no funcionará debido a la evaluación de cortocircuito de los operadores lógicos. Si form1 no es válido, form2 no se evaluará y faltarán sus mensajes de error.
Eso es solo un ejemplo. Por lo que yo sé, no hay una alternativa codiciosa para and
/or
como en otros idiomas (es decir, Smalltalk). Puedo imaginarme que ese problema ocurre bajo diferentes circunstancias (y no solo en Python). Las soluciones en las que pude pensar son torpes (ns anidados, asignando los valores de retorno a variables locales y usándolos en la sentencia if). Me gustaría saber la manera pitónica de resolver este tipo de problemas.
¡Gracias de antemano!
Exactamente lo que busqué. ¡Gracias! – j0ker
Me tomó unos segundos llegar a esto. Es un caso de esquina que no había considerado antes (a menudo trabajo en Fortran, lo que no garantiza el cortocircuito, pero lo permite) y siempre trato de encontrar la forma de asegurarme de que mis expresiones estén en cortocircuito. Pensar en esto fue un poco retrógado para mí :). – mgilson
Sí, el 'todo' es el camino a seguir aquí, pero ¿dónde usaste listas de comprensión? Solo veo una lista simple en tu ejemplo. – rantanplan