Что ж, это открытый вопрос, и у меня есть два аспекта, которые я хочу затронуть: когда добавлять утверждения и как писать сообщения об ошибках.
Цель
Чтобы объяснить это новичку - утверждения - это утверждения, которые могут вызвать ошибки, но вы их не поймаете. И их обычно не следует поднимать, но в реальной жизни они все равно иногда поднимаются. И это серьезная ситуация, из которой код не может восстановиться, что мы называем «фатальной ошибкой».
Далее, это для «целей отладки», что, хотя и правильно, звучит очень пренебрежительно. Мне больше нравится формулировка «объявляющие инварианты, которые никогда не следует нарушать», хотя она работает по-разному для разных начинающих ... Некоторые «просто получают это», а другие либо не находят в этом смысла, либо заменяют нормальные исключения, или даже контролировать поток с ним.
Стиль
В Python assert
это утверждение, а не функция! (помните assert(False, 'is true')
, не поднимет. Но, имея это в стороне:
Когда и как написать необязательное «сообщение об ошибке»?
Это на самом деле относится к платформам модульного тестирования, которые часто имеют много специальных методов для выполнения утверждений ( assertTrue(condition)
и assertFalse(condition), assertEqual(actual, expected)
т. Д.). Они также часто дают возможность прокомментировать утверждение.
В одноразовом коде вы можете обойтись без сообщений об ошибках.
В некоторых случаях нечего добавить к утверждению:
def dump (что-то): утверждение isinstance (что-то, Dumpable) # ...
Но кроме этого, сообщение полезно для общения с другими программистами (которые иногда являются интерактивными пользователями вашего кода, например, в Ipython / Jupyter и т. Д.).
Дайте им информацию, а не только утечки внутренних деталей реализации.
вместо:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
записывать:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
или, может быть, даже:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Я знаю, я знаю - это не случай для статического утверждения, но я хочу указать на информационную ценность сообщения.
Негативное или позитивное сообщение?
Это может быть спорным, но мне больно читать такие вещи, как:
assert a == b, 'a is not equal to b'
это две противоречивые вещи, написанные рядом друг с другом. Поэтому, когда бы я ни влиял на кодовую базу, я настаиваю на том, чтобы указать, что мы хотим, используя дополнительные глаголы, такие как «должен» и «должен», а не говорить то, что нам не нужно.
утверждать a == b, 'a должно быть равно b'
Затем получение AssertionError: a must be equal to b
также читабельно, и выражение выглядит логичным в коде. Кроме того, вы можете получить что-то из этого, не читая трассировку (которая иногда может даже не быть доступной).