tutorial lenguaje español descargar python

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.