Piszę skrypt, który robi coś z plikiem tekstowym (to, co robi, nie ma znaczenia dla mojego pytania). Więc zanim zrobię coś z plikiem, chcę sprawdzić, czy plik istnieje. Mogę to zrobić, nie ma problemu, ale chodzi bardziej o estetykę.
Oto mój kod, implementujący to samo na dwa różne sposoby.
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.
lub:
def modify_file(filename):
if not os.path.isfile(filename):
return 'file does NOT exist.'
file does NOT exist.
Pierwsza metoda generuje dane wyjściowe, które są w większości trywialne, jedyne, na czym mi zależy, to że plik nie istnieje.
Druga metoda zwraca ciąg znaków, jest to proste.
Moje pytania brzmią: która metoda jest lepsza, aby poinformować użytkownika, że plik nie istnieje? Zastosowanie tej assert
metody wydaje się w jakiś sposób bardziej pytoniczne.
modify_file()
towith open(filename) as f:
, wówczasIOError
również zostanie podniesiona. Nowsze wersje języka Python podają więcej szczegółów w podklasachIOError
(FileNotFoundError
szczególnie przychodzi na myśl), które mogą być pomocne dla programisty używającego tego interfejsu API. Jeśli kod wykona własne kontrole i podniesie,IOError
wówczas te pomocne szczegóły zostaną utracone.assert
jest przeznaczony dla przypadków, w których programista wywołujący funkcję popełnił błąd, w przeciwieństwie do użytkownika . Używanieassert
w takich okolicznościach pozwala upewnić się, że programiści prawidłowo używają funkcji podczas testowania, ale następnie usunąć ją z produkcji.Jego wartość jest nieco ograniczona, ponieważ musisz upewnić się, że ćwiczysz tę ścieżkę przez kod, i często chcesz dodatkowo poradzić sobie z problemem za pomocą oddzielnej
if
instrukcji w produkcji.assert
jest najbardziej użyteczny w sytuacjach takich jak: „Chcę pomóc obejść ten problem, jeśli użytkownik go dotknie, ale jeśli programista go dotknie, chcę, aby mocno się zawiesił, aby poprawił kod, który wywołuje tę funkcję niepoprawnie”.W twoim konkretnym przypadku brakujący plik jest prawie na pewno błędem użytkownika i powinien zostać rozwiązany poprzez zgłoszenie wyjątku.
źródło
From UsingAssertionsEffectective
źródło