Ich schreibe ein Skript, das etwas mit einer Textdatei macht (was es tut, ist für meine Frage jedoch irrelevant). Bevor ich also etwas mit der Datei anfange, möchte ich überprüfen, ob die Datei existiert. Ich kann das, kein Problem, aber das Problem ist mehr das der Ästhetik.
Hier ist mein Code, der dasselbe auf zwei verschiedene Arten implementiert.
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.
oder:
def modify_file(filename):
if not os.path.isfile(filename):
return 'file does NOT exist.'
file does NOT exist.
Die erste Methode erzeugt eine Ausgabe, die meistens trivial ist. Das einzige, was mich interessiert, ist, dass die Datei nicht existiert.
Die zweite Methode gibt einen String zurück, es ist einfach.
Meine Fragen sind: Welche Methode ist besser, um den Benutzer wissen zu lassen, dass die Datei nicht vorhanden ist? Die assert
Methode scheint irgendwie pythonischer zu sein.
modify_file()
istwith open(filename) as f:
, dannIOError
würde auch angehoben werden. Und neuere Python-Versionen enthalten detailliertere Informationen in Unterklassen vonIOError
(FileNotFoundError
speziell in den Sinn kommenden) Elementen, die für Entwickler, die diese API verwenden, hilfreich sein können. Wenn der Code selbst prüft und auslöst, gehtIOError
dieses hilfreiche Detail verloren.assert
ist für Fälle gedacht, in denen der Programmierer , der die Funktion aufruft, im Gegensatz zum Benutzer einen Fehler gemacht hat . Unterassert
diesen Umständen können Sie sicherstellen, dass ein Programmierer Ihre Funktion während des Testens korrekt verwendet, diese jedoch in der Produktion entfernt.Ihr Wert ist etwas begrenzt, da Sie sicherstellen müssen, dass Sie diesen Pfad durch den Code gehen, und Sie das Problem häufig zusätzlich mit einer separaten
if
Anweisung in der Produktion behandeln möchten .assert
ist am nützlichsten in Situationen wie "Ich möchte dieses Problem hilfreich umgehen, wenn ein Benutzer es trifft, aber wenn ein Entwickler es trifft, möchte ich, dass es hart abstürzt, damit er den Code korrigiert, der diese Funktion falsch aufruft."In Ihrem speziellen Fall ist eine fehlende Datei mit ziemlicher Sicherheit ein Benutzerfehler und sollte durch Auslösen einer Ausnahme behoben werden.
quelle
von UsingAssertionsEffectively
quelle