Python - assert vs if & вернуть

Я пишу скрипт, который что-то делает с текстовым файлом (тем не менее, для моего вопроса это не имеет значения). Поэтому, прежде чем я что-то сделаю с файлом, я хочу проверить, существует ли файл. Я могу это сделать, никаких проблем, но проблема в том, что касается эстетики.

Вот мой код, реализующий одну и ту же вещь двумя разными способами.

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 кажется более чем питоническим.

6 голосов | спросил Vader 29 Jpm1000000pmWed, 29 Jan 2014 20:25:47 +040014 2014, 20:25:47

3 ответа


26

Вместо этого вы можете выбрать third : используйте raise и конкретное исключение. Это может быть один из встроенных исключений или вы можете создать настраиваемое исключение для задания.

В этом случае я бы использовал IOError , но ValueError может также соответствовать:

def modify_file(filename):
    if not os.path.isfile(filename):
        raise IOError('file does NOT exist.')

Использование определенного исключения позволяет поднять другие исключения для разных исключительных обстоятельств и позволяет вызывающему обработать исключение изящно.

Конечно, многие операции с файлами (например, open()) сами raise OSError уже; явно первое тестирование, если файл существует, может быть избыточным здесь.

Не используйте assert; если вы запустите python с флагом -O, все утверждения удаляются из кода.

ответил Martijn Pieters 29 Jpm1000000pmWed, 29 Jan 2014 20:34:27 +040014 2014, 20:34:27
6

assert предназначен для случаев, когда вызывающий функцию программист совершил ошибку, в отличие от пользователь . Используя assert в этом случае, вы можете убедиться, что программист правильно использует вашу функцию во время тестирования, но затем отключите ее в процессе производства.

Его значение несколько ограничено, так как вы должны убедиться, что используете этот путь через код, и часто хотите дополнительно решить проблему с помощью отдельного if в производстве. assert наиболее полезен в таких ситуациях, как «Я хочу помочь обойти эту проблему, если пользователь на нее нападет, но если разработчик ударит ее , Я хочу, чтобы он сильно разбился, поэтому он исправит код, который неправильно вызывает эту функцию. "

В вашем конкретном случае отсутствующий файл почти наверняка является ошибкой пользователя и должен обрабатываться путем создания исключения.

ответил Karl Bielefeldt 30 Jam1000000amThu, 30 Jan 2014 02:26:13 +040014 2014, 02:26:13
2

Из UsingAssertionsEffectively

  

Проверка isinstance () не должна быть чрезмерной: если она обманывает, как   утка, возможно, нет необходимости слишком глубоко разбираться в том,   на самом деле. Иногда бывает полезно передать значения, которые не были   ожидаемый оригинальным программистом.

     

Места для рассмотрения утверждений:

checking parameter types, classes, or values
checking data structure invariants
checking "can't happen" situations (duplicates in a list, contradictory state variables.)
after calling a function, to make sure that its return is reasonable 
     

В целом, если что-то пойдет не так, мы хотим сделать   это совершенно очевидно как можно скорее.

     

Легче поймать неверные данные в том месте, где оно происходит,   чтобы выяснить, как это произошло позже, когда это вызывает проблемы.

     

Утверждения не заменяют модульные тесты или системные тесты, но   скорее дополнением. Потому что утверждения - это чистый способ изучить   внутреннее состояние объекта или функции, они обеспечивают «бесплатно»   ясная помощь для теста черного ящика, который анализирует внешний   поведение.

     

Утверждения должны использоваться not для проверки случаев сбоя, которые могут   происходят из-за плохого пользовательского ввода или операционной системы /среды   сбоев, таких как файл, который не найден. Вместо этого вы должны поднять   исключение, или распечатать сообщение об ошибке или что-то подходящее. Один   важная причина, по которой утверждения должны использоваться только для самопроверки   программа состоит в том, что утверждения могут быть отключены во время компиляции.

     

Если Python запущен с опцией -O, то утверждения будут   лишен и не оценен. Поэтому, если код сильно использует утверждения,   но критична для производительности, тогда есть система их поворота   выкл. в выпусках. (Но не делайте этого, если это действительно   необходимо. Было научно доказано, что некоторые ошибки появляются только   когда клиент использует машину, и мы хотим, чтобы утверждения помогали там   тоже. :-))

ответил dspjm 17 42016vEurope/Moscow11bEurope/MoscowThu, 17 Nov 2016 17:10:07 +0300 2016, 17:10:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132