J'écris un script qui fait quelque chose dans un fichier texte (ce qu'il fait n'est cependant pas pertinent pour ma question). Donc, avant de faire quelque chose au fichier, je veux vérifier si le fichier existe. Je peux le faire, pas de problème, mais le problème est plutôt celui de l'esthétique.
Voici mon code, implémentant la même chose de deux manières différentes.
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.
La première méthode produit une sortie qui est principalement triviale, la seule chose qui m'importe, c'est que le fichier n'existe pas.
La deuxième méthode renvoie une chaîne, c'est simple.
Ma question est: quelle méthode est la meilleure pour faire savoir à l'utilisateur que le fichier n'existe pas? L'utilisation de la assert
méthode semble en quelque sorte plus pythonique.
modify_file()
estwith open(filename) as f:
, alorsIOError
serait également augmentée. Et les versions plus récentes de Python ont fourni plus de détails dans les sous-classes deIOError
(celaFileNotFoundError
me vient spécifiquement à l'esprit) qui pourraient être utiles pour un développeur utilisant cette API. Si le code effectue ses propres vérifications et augmenteIOError
alors ces détails utiles seraient perdus.assert
est destiné aux cas où le programmeur appelant la fonction a fait une erreur, par opposition à l' utilisateur . L'utilisationassert
dans ces circonstances vous permet de vous assurer qu'un programmeur utilise correctement votre fonction pendant les tests, puis de la supprimer en production.Sa valeur est quelque peu limitée car vous devez vous assurer d'exercer ce chemin dans le code et vous souhaitez souvent gérer le problème en plus avec une
if
instruction distincte en production.assert
est le plus utile dans des situations telles que «Je veux contourner ce problème si un utilisateur le rencontre, mais si un développeur le rencontre, je veux qu'il plante brutalement afin qu'il corrige le code qui appelle cette fonction de manière incorrecte».Dans votre cas particulier, un fichier manquant est presque certainement une erreur utilisateur et doit être traité en levant une exception.
la source
De UsingAssertionsEffectively
la source