Estou escrevendo um script que faz algo em um arquivo de texto (o que ele faz é irrelevante para a minha pergunta). Portanto, antes de fazer algo no arquivo, quero verificar se o arquivo existe. Eu posso fazer isso, não há problema, mas a questão é mais a estética.
Aqui está o meu código, implementando a mesma coisa de duas maneiras 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.
ou:
def modify_file(filename):
if not os.path.isfile(filename):
return 'file does NOT exist.'
file does NOT exist.
O primeiro método produz uma saída que é principalmente trivial, a única coisa que me interessa é que o arquivo não exista.
O segundo método retorna uma string, é simples.
Minhas perguntas são: qual método é melhor para informar ao usuário que o arquivo não existe? Usar o assert
método parece de alguma forma mais pitônico.
modify_file()
éwith open(filename) as f:
,IOError
também seria aumentada. E versões mais recentes do Python forneceram mais detalhes nas subclasses deIOError
(FileNotFoundError
especificamente vem à mente) que podem ser úteis para um desenvolvedor que usa essa API. Se o código fizer suas próprias verificações e elevaçõesIOError
, esses detalhes úteis serão perdidos.assert
destina-se a casos em que o programador que chamou a função cometeu um erro, em oposição ao usuário . O usoassert
sob essa circunstância permite garantir que um programador esteja usando sua função corretamente durante o teste, mas depois a retire na produção.Seu valor é um pouco limitado, já que você precisa garantir que você exerça esse caminho através do código e geralmente deseja lidar com o problema adicionalmente com uma
if
declaração separada na produção.assert
é mais útil em situações como "Desejo solucionar esse problema de maneira útil se um usuário o encontrar, mas se um desenvolvedor o encontrar, quero que ele sofra uma falha grave para que ele corrija o código que chama essa função incorretamente".No seu caso particular, um arquivo ausente é quase certamente um erro do usuário e deve ser tratado gerando uma exceção.
fonte
De UsingAssertionsEffectively
fonte