Почему утверждают, в основном не используется? - PullRequest
56 голосов
/ 01 февраля 2012

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

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

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

Ответы [ 4 ]

56 голосов
/ 03 февраля 2012

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

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

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

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

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

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

32 голосов
/ 13 октября 2012

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

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

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

Unit Testing

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

Повышенное уважение промышленности к испытаниям

Заявление assert лучше всего служит последней линией защиты.Когда этот язык управлял миром, он поднялся до высоких и неприкасаемых высот, как отличный способ реализовать новомодное «защитное программирование»;он распознает и улавливает катастрофические бедствия в тот момент, когда они находятся на грани.Это было до того, как значение Тестирования стало широко признанным и уважаемым, и бедствия были значительно более распространенными.

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

12 голосов
/ 01 февраля 2012

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

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

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

0 голосов
/ 04 ноября 2017

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

...