Python - afirmar vs si y regresar

7

Estoy escribiendo un script que hace algo con un archivo de texto (lo que hace es irrelevante para mi pregunta). Entonces, antes de hacer algo en el archivo, quiero verificar si el archivo existe. Puedo hacer esto, no hay problema, pero el problema es más de estética.

Aquí está mi código, implementando lo mismo de dos maneras diferentes.

def modify_file(filename):
    assert os.path.isfile(filename), 'file does NOT exist.'


Traceback (most recent call last):
  File "clean_files.py", line 15, in <module>
    print(clean_file('tes3t.txt'))
  File "clean_files.py", line 8, in clean_file
    assert os.path.isfile(filename), 'file does NOT exist.'
AssertionError: file does NOT exist.

o:

def modify_file(filename):
    if not os.path.isfile(filename):
        return 'file does NOT exist.'


file does NOT exist.

El primer método produce una salida que es principalmente trivial, lo único que me importa es que el archivo no existe.

El segundo método devuelve una cadena, es simple.

Mi pregunta es: ¿qué método es mejor para que el usuario sepa que el archivo no existe? Usar el método assert parece de alguna manera más pythonic.

    
pregunta Vader 29.01.2014 - 17:25

3 respuestas

27

Irías con una opción tercer : usa raise y una excepción específica. Este puede ser uno de los excepciones integradas , o puede crear una excepción personalizada para el trabajo.

En este caso, usaría IOError , pero un < a href="http://docs.python.org/2/library/exceptions.html#exceptions.ValueError"> ValueError también puede ajustarse:

def modify_file(filename):
    if not os.path.isfile(filename):
        raise IOError('file does NOT exist.')

El uso de una excepción específica le permite generar otras excepciones para diferentes circunstancias excepcionales, y le permite a la persona que llama manejar la excepción con gracia.

Por supuesto, muchas operaciones de archivos (como open() ) ellas mismas ya aumentan OSError ; La primera prueba explícita si el archivo existe puede ser redundante aquí.

No uses assert ; Si ejecuta Python con el indicador -O , todas las aserciones se eliminan del código.

    
respondido por el Martijn Pieters 29.01.2014 - 17:34
7

assert está destinado a los casos en los que el programador que llama a la función cometió un error, a diferencia del usuario . El uso de assert en esa circunstancia le permite asegurarse de que un programador esté utilizando su función correctamente durante las pruebas, pero luego la elimine en producción.

Su valor es algo limitado, ya que debe asegurarse de que ejecute esa ruta a través del código y, a menudo, también desea manejar el problema con una declaración if en producción. assert es más útil en situaciones como: "Quiero solucionar este problema si un usuario lo golpea, pero si lo hace un desarrollador, quiero que se bloquee con fuerza para que arregle el código que llama a esta función de manera incorrecta. "

En su caso particular, es casi seguro que un archivo faltante sea un error del usuario, y debe manejarse mediante una excepción.

    
respondido por el Karl Bielefeldt 29.01.2014 - 23:26
3

De UsingAssertionsEffectively

  

La comprobación de isinstance () no debe utilizarse en exceso: si se graba como un   pato, tal vez no hay necesidad de investigar demasiado a fondo si   realmente es. A veces puede ser útil pasar valores que no fueron   anticipado por el programador original.

     

Lugares para considerar poner aserciones:

checking parameter types, classes, or values
checking data structure invariants
checking "can't happen" situations (duplicates in a list, contradictory state variables.)
after calling a function, to make sure that its return is reasonable 
     

El punto general es que si algo sale mal, queremos hacer   Es completamente obvio lo antes posible.

     

Es más fácil capturar datos incorrectos en el punto en el que van que   para averiguar cómo llegó allí más tarde cuando causa problemas.

     

Las aserciones no son un sustituto de las pruebas unitarias o las pruebas del sistema, pero   más bien un complemento. Porque las afirmaciones son una forma limpia de examinar la   Estado interno de un objeto o función, proporcionan "gratis" una   asistencia clara a una prueba de caja negra que examina el externo   comportamiento.

     

Las aserciones no deben usarse para probar los casos de falla que pueden   ocurre debido a una mala entrada del usuario o sistema operativo / entorno   fallas, como un archivo que no se encuentra. En su lugar, deberías subir una   excepción, o imprimir un mensaje de error, o lo que sea apropiado. Uno   razón importante por la que las afirmaciones solo deben usarse para autopruebas de   El programa es que las aserciones se pueden desactivar en tiempo de compilación.

     

Si Python se inicia con la opción -O, las aserciones serán   Excluido y no evaluado. Así que si el código usa aserciones en gran medida,   pero es crítico para el rendimiento, entonces hay un sistema para convertirlos   apagado en versiones de lanzamiento. (Pero no hagas esto a menos que sea realmente   necesario. Se ha comprobado científicamente que algunos errores solo aparecen   cuando un cliente usa la máquina y queremos que las aserciones ayuden allí   también. :-))

    
respondido por el dspjm 17.11.2016 - 15:10

Lea otras preguntas en las etiquetas