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 True
o 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 == True
parte o debo agregar un tipo de datos tri-bool? No quiero que la simulate
función arroje una excepción, ya que todo lo que quiero que haga el programa externo con un error es registrarlo y continuar.
simulate
funció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.simulate
tiene 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,simulate
está hecho. VolverNone
no es tan útil como generar una excepción adecuada, o permitir que una excepción se propague a travéssimulate
del script de llamada para su manejo.except Exception:
en su lugar. Esto detecta todos los errores "reales", junto conWarning
yStopIteration
. Sin embargo, permiteKeyboardInterrupt
y aSystemExit
travé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
simulate
función para incluir más códigos de retorno, mantener este código podría convertirse en un problema.Es
simulate
posible 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 == None
es ineficiente. Hacera is None
.None
es un objeto singleton especial, solo puede haber uno. Solo verifique si tiene ese objeto.fuente
True
no 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 == True
producen un resultado diferente queif something
, por ejemplo, para no booleanossomething
.2==True
produce falsa mientras que2
se considera verdadero;None==False
es falso peronot None
es cierto!something
retornosTrue
sobrebool(something)
. En ese caso, si SOLO quiere comprobar sisomething
tiene un valor deTrue
iebool
. Entonces tienes que hacerif something == True
IMO.Me gustaría hacer hincapié en que, aunque hay situaciones en que
if expr :
no es suficiente porque uno quiere asegurarse de queexpr
esTrue
y no sólo diferente de0
/None
/ lo que sea,is
ha 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
False
se devuelve, se imprimirá'error parsing stream'
.