Подтвердить что ты не робот

Почему утверждение не используется в основном?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Улучшение отраслевого уважения при тестировании

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

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

Ответ 3

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

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

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

Ответ 4

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