Ну, це питання відкрите, і у мене є два аспекти, які я хочу торкнутися: коли додати твердження і як написати повідомлення про помилки.
Призначення
Щоб пояснити це початківцю - твердження - це твердження, які можуть викликати помилки, але ви не будете їх вловлювати. І їх зазвичай не слід виховувати, але в реальному житті вони іноді все одно піднімаються. І це серйозна ситуація, з якої код не може відновитись, і ми називаємо «фатальною помилкою».
Далі - це для «налагодження», що, хоч і правильно, звучить дуже зневажливо. Мені подобається формулювання «декларування інваріантів, яке ніколи не повинно бути порушено», хоча воно працює по-різному для різних початківців… Деякі «просто отримують це», а інші або не знаходять для нього ніякої користі, або замінюють звичайні винятки, або навіть контролювати потік за допомогою нього.
Стиль
У Python assert
- це оператор, а не функція! (пам'ятаю assert(False, 'is true')
, не піднімуть. Але, вибивши це з шляху:
Коли і як написати необов'язкове "повідомлення про помилку"?
Це acually відноситься до одиничних тестування рамок, які часто мають багато спеціалізованих методів робити твердження ( assertTrue(condition)
, і assertFalse(condition), assertEqual(actual, expected)
т.д.). Вони часто також надають спосіб коментувати твердження.
У викидальному коді можна обійтися без повідомлень про помилки.
У деяких випадках до твердження немає чого додати:
def dump (щось): стверджувати речовина (щось, 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'
це дві суперечливі речі, написані поруч з іншим. Тож, коли я маю вплив на кодову базу, я наполягаю на вказівці того, що ми хочемо, використовуючи додаткові дієслова на зразок "must" і "should", а не говорити те, чого ми не хочемо.
стверджуємо a == b, "a має бути рівним b"
Тоді отримання AssertionError: a must be equal to b
також читається, і вислів виглядає логічно в коді. Крім того, ви можете отримати щось із цього, не прочитавши прослідкування (яке іноді може бути навіть недоступним).