Tengo una función que puede devolver una de tres cosas:
- éxito (
True) - fracaso (
False) - error al leer / analizar secuencia (
None)
Mi pregunta es, si se supone que no debo hacer una prueba Trueo False, ¿cómo debo ver cuál es el resultado? A continuación se muestra cómo lo estoy haciendo actualmente:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
¿es realmente tan simple como eliminar la == Trueparte o debo agregar un tipo de datos tri-bool? No quiero que la simulatefunción arroje una excepción, ya que todo lo que quiero que haga el programa externo con un error es registrarlo y continuar.

simulatefunción capto todas las excepciones; No quiero que ocurra nada dentro del simulador para detener el resto del programa en ejecución (y procesar el siguiente elemento). Pero las respuestas me están haciendo cambiar de opinión.simulatetiene cosas que puede atrapar y volver a intentar, está bien. Pero si "falla", no debería volverNone. Simplemente debería generar una excepción al script que lo llamó. De cualquier manera,simulateestá hecho. VolverNoneno es tan útil como generar una excepción adecuada, o permitir que una excepción se propague a travéssimulatedel script de llamada para su manejo.except Exception:en su lugar. Esto detecta todos los errores "reales", junto conWarningyStopIteration. Sin embargo, permiteKeyboardInterrupty aSystemExittravés. Si realmente quiere atraparlos, probablemente sea mejor usar otro try / except externo o alguna otra estructura que documente claramente su intención, ya que esos no son "errores". (Pero dije "casi nunca" ... tal vez en su caso realmente quiera agarrar todo, e incluso evitar que Ctrl-C osys.exit()salir, etc.)Respuestas:
¡No temas a la excepción! Hacer que su programa solo inicie sesión y continúe es tan fácil como:
Y ahora puede tener un tipo de notificación mucho más rico del método de simulación en cuanto a qué salió mal exactamente, en caso de que encuentre error / no-error que no sea lo suficientemente informativo.
fuente
traceback.format_exc(). Ver esta respuesta SO.manténgalo simple y explícito. Por supuesto, puede predefinir un diccionario.
Si planea modificar su
simulatefunción para incluir más códigos de retorno, mantener este código podría convertirse en un problema.Es
simulateposible que también genere una excepción en el error de análisis, en cuyo caso lo atraparía aquí o lo dejaría propagar un nivel superior y el bit de impresión se reduciría a una instrucción if-else de una línea.fuente
Nunca, nunca, nunca digas
Nunca. Es una locura, ya que está repitiendo de forma redundante lo que se especifica de forma redundante como la regla de condición redundante para una declaración if.
Peor aún, nunca, nunca, nunca digas
Usted tiene
not. Sientase libre de usarlo.Finalmente, hacer
a == Nonees ineficiente. Hacera is None.Nonees un objeto singleton especial, solo puede haber uno. Solo verifique si tiene ese objeto.fuente
Trueno son redundantes (aunque estoy de acuerdo en que no es razonable). Se podría llamar a una__eq__u otra método especial, lo que podría hacer prácticamente cualquier cosa.if something == Trueproducen un resultado diferente queif something, por ejemplo, para no booleanossomething.2==Trueproduce falsa mientras que2se considera verdadero;None==Falsees falso peronot Nonees cierto!somethingretornosTruesobrebool(something). En ese caso, si SOLO quiere comprobar sisomethingtiene un valor deTrueiebool. Entonces tienes que hacerif something == TrueIMO.Me gustaría hacer hincapié en que, aunque hay situaciones en que
if expr :no es suficiente porque uno quiere asegurarse de queexpresTruey no sólo diferente de0/None/ lo que sea,isha de ser preferido a partir==por la misma razón S. Lott mencionado para evitar== None.De hecho, es un poco más eficiente y, cereza en el pastel, más legible para los humanos.
fuente
Creo que lanzar una excepción es una mejor idea para su situación. Una alternativa será el método de simulación para devolver una tupla. El primer elemento será el estado y el segundo el resultado:
fuente
Falsese devuelve, se imprimirá'error parsing stream'.