Почему assert в значительной степени не используется?


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

Кажется, это идеальный механизм для запуска приложений Python в режиме отладки. Но, глядя на несколько проектов Python, таких как django, twisted и zope,assert практически не используется. Итак, почему же это случилось?

почему утверждения не часто используются в сообществе Python?

4 53

4 ответа:

Я думаю, главная причина assert не используется чаще это никто не использует "оптимизированный" режим Python.

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

в Python, на с другой стороны, нет строгого различия между debug и релиз режим. Интерпретатор имеет "флаг оптимизации" (-O), но в настоящее время это фактически не оптимизирует байтовый код, а только удаляет утверждения.

поэтому большинство пользователей Python просто игнорируют -O флаг и запустить свои скрипты в "нормальном режиме", который является вид режим отладки, так как утверждения включены и __debug__ - это True, но является "производство готово".

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

((*) это например как Java VM делает это, показывая -ea (включить утверждений) переключатель.)

на ум приходит несколько причин...

Это не основная функция

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

Тестирование

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

улучшенное уважение индустрии для испытывать

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

сегодня это неслыханно, чтобы любое серьезное коммерческое программное обеспечение было выпущено без какой-либо формы тестирования. Тестирование воспринимается всерьез и превратилось в массовое поле. Есть профессионалы тестирования и отделы обеспечения качества с большими контрольными списками и формальными подписями. В этих условиях программисты, как правило, не утруждают себя утверждениями, потому что они уверены, что их код будет подвергнут столь утомительному тестированию, что вероятность дурацких условий на грани катастрофы настолько мала, что пренебрежимо мала. Это не значит, что они правы, но если вина за ленивое программирование может быть перенесена на отдел QA, черт возьми, почему бы и нет?

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

Assert отлично подходит, когда вы пытаетесь выполнить отладку и т. д. В своем собственном приложении. Как указано в ссылке, которую вы предоставили, однако, использование условного лучше, когда приложение может быть в состоянии предсказать и восстановить из состояния. Я не использовал zope, но как в Twisted, так и в Django, их приложения могут восстанавливаться и продолжать работу после многих ошибок в коде. В некотором смысле они уже "скомпилировали" утверждения, поскольку они действительно могут справиться с ними.

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

согласно моему опыту, asserts в основном используются на этапе разработки программы-для проверки пользовательских входов. asserts на самом деле не нужны, чтобы поймать ошибки программирования. Сам Python очень хорошо способен улавливать подлинные ошибки программирования, такие как ZeroDivisionError, TypeError или так.