Я пишу сценарий, который что-то делает с текстовым файлом (хотя он не имеет отношения к моему вопросу). Поэтому, прежде чем что-то делать с файлом, я хочу проверить, существует ли файл. Я могу сделать это, не проблема, но проблема больше в эстетике.
Вот мой код, реализующий одну и ту же вещь двумя разными способами.
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.
или:
def modify_file(filename):
if not os.path.isfile(filename):
return 'file does NOT exist.'
file does NOT exist.
Первый метод производит вывод, который в основном тривиален, единственное, что меня волнует, это то, что файл не существует.
Второй метод возвращает строку, это просто.
Мои вопросы: какой метод лучше сообщить пользователю, что файл не существует? Использование assert
метода кажется чем-то более питонным.
modify_file()
являетсяwith open(filename) as f:
, тоIOError
также будет поднят. Более поздние версии Python предоставили больше подробностей в подклассахIOError
(FileNotFoundError
особенно на ум), которые могут быть полезны для разработчика, использующего этот API. Если код выполняет свои собственные проверки и повышения,IOError
то эта полезная деталь будет потеряна.assert
предназначен для случаев, когда программист, вызвавший функцию, допустил ошибку, в отличие от пользователя . Использованиеassert
в этих условиях позволяет вам убедиться, что программист правильно использует вашу функцию во время тестирования, а затем исключить ее из производства.Его значение несколько ограничено, так как вы должны убедиться, что вы проходите этот путь через код, и вам часто требуется дополнительно решить проблему с помощью отдельного
if
оператора в процессе производства.assert
наиболее полезен в таких ситуациях, как «Я хочу помочь обойти эту проблему, если пользователь нажмет ее, но если разработчик нажмет ее, я хочу, чтобы она сильно зависала, чтобы он исправил код, вызывающий эту функцию неправильно».В вашем конкретном случае, пропущенный файл почти наверняка является ошибкой пользователя, и его следует обработать, вызвав исключение.
источник
От использования утверждений эффективно
источник