lenguaje - python tutorial
En Python, ¿cómo debo probar si una variable es None, True o False? (5)
Tengo una función que puede devolver una de tres cosas:
- éxito (
True
) - falla (
False
) - lectura de error / secuencia de análisis (
None
)
Mi pregunta es, si no se supone que debo probar contra True
o False
, ¿cómo debo ver cuál es el resultado? Debajo está 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 parte == True
o debería agregar un tipo de datos tri-bool? No quiero que la función simulate
arroje una excepción, ya que todo lo que quiero que el programa externo haga con un error es registrarlo y continuar.
¡No temas a la Excepción! Hacer que su programa simplemente se registre y continúe es tan fácil como:
try:
result = simulate(open("myfile"))
except SimulationException as sim_exc:
print "error parsing stream", sim_exc
else:
if result:
print "result pass"
else:
print "result fail"
# execution continues from here, regardless of exception or not
Y ahora puede tener un tipo de notificación mucho más rica desde el método de simulación en cuanto a qué fue exactamente lo que salió mal, en caso de que encuentre que el error / no-error no es lo suficientemente informativo.
Creo que lanzar una excepción es una mejor idea para tu 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:
result = simulate(open("myfile"))
if not result[0]:
print "error parsing stream"
else:
ret= result[1]
Me gustaría hacer hincapié en que, incluso si hay situaciones en las if expr :
no es suficiente porque uno quiere asegurarse de que expr
es True
y no solo diferente de 0
/ None
/ lo que sea, is
prefiere desde ==
para el mismo motivo que S.Lott mencionó para evitar == None
.
De hecho, es un poco más eficiente y, cereza en la torta, más humana legible.
Entrada:
from time import time
t0 = time()
print ( ( 1 == 1 ) == True )
t1 = time()
print ( ( 1 == 1 ) is True )
t2 = time()
print ''{:e}s/n{:e}s''.format( t1-t0, t2-t1)
Salida:
True
True
1.201630e-04s
8.797646e-05s
Nunca, nunca, nunca digas
if something == True:
Nunca. Es una locura, ya que estás repitiendo redundantemente lo que se especifica de forma redundante como la regla de condición redundante para una instrucción if.
Peor aún, nunca, nunca, nunca digas
if something == False:
Usted not
tiene. Sientase libre de usarlo.
Finalmente, hacer a == None
es ineficiente. Hacer a is None
. None
es un objeto singleton especial, solo puede haber uno. Solo verifica si tienes ese objeto.
if result is None:
print "error parsing stream"
elif result:
print "result pass"
else:
print "result fail"
mantenerlo simple y explícito. Por supuesto, puede predefinir un diccionario.
messages = {None: ''error'', True: ''pass'', False: ''fail''}
print messages[result]
Si planea modificar su función de simulate
para incluir más códigos de retorno, mantener este código podría convertirse en un problema.
El simulate
también podría generar una excepción en el error de análisis, en cuyo caso, usted podría atraparlo aquí o dejar que se propague un nivel y el bit de impresión se reduciría a una línea de una declaración if-else.