Estoy escribiendo un script que hace algo en un archivo de texto (sin embargo, lo que hace es irrelevante para mi pregunta). Entonces, antes de hacer algo al archivo, quiero verificar si el archivo existe. Puedo hacer esto, no hay problema, pero el problema es más estético.
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 en su mayoría 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 assert
método parece de alguna manera más pitónico.
modify_file()
eswith open(filename) as f:
, entoncesIOError
también se planteará. Y las versiones más recientes de Python han proporcionado más detalles en las subclases deIOError
(FileNotFoundError
específicamente viene a la mente) que podrían ser útiles para un desarrollador que utiliza esta API. Si el código realiza sus propios controles y aumentosIOError
, se perderían esos detalles útiles.assert
está destinado a casos en los que el programador que llamó a la función cometió un error, a diferencia del usuario . El usoassert
bajo esa circunstancia le permite asegurarse de que un programador esté usando su función correctamente durante la prueba, pero luego lo elimina en producción.Su valor es algo limitado, ya que debe asegurarse de ejercer esa ruta a través del código, y a menudo desea manejar adicionalmente el problema con una
if
declaración separada en producción.assert
es más útil en situaciones como, "Quiero solucionar este problema de manera útil si un usuario lo golpea, pero si un desarrollador lo golpea, quiero que se bloquee con fuerza para que repare el código que llama incorrectamente a esta función".En su caso particular, un archivo faltante es casi seguro un error del usuario, y debe manejarse con una excepción.
fuente
De UsingAssertionsEffectively
fuente