что делает assert в python
Оператор assert в Python: объяснение на примерах
Оператор assert – это встроенный оператор или ключевое слово в Python, используемое для отладки кода. Это своего рода проверка, которая исследует функциональность вашего кода.
В этой статье мы рассмотрим оператор assert в Python и разберем принципы его работы на нескольких примерах.
Синтаксис
Синтаксис использования оператора assert следующий:
Также можно добавить дополнительное сообщение, которое будет выводиться при ошибке. В таком случае синтаксис assert будет следующий:
Примеры
Чтобы разобраться, как пользоваться оператором assert на практике, давайте обсудим несколько примеров.
В assert мы указали условие, что num2 (делитель) не должен быть равен нулю. Данное условие не выполняется, потому что значение num2 равно нулю. Интерпретатор Python выдает ошибку AssertionError вместе с добавленным нами сообщением «The divisor is zero» («Делитель равен нулю»).
Теперь давайте изменим значение num2 и выполним нашу программу снова. На этот раз утверждение assert истинно, так что в этом случае ничего не произойдет. Ошибка не появляется, вместо этого выполняется следующая строка. Таким образом, на экран выведется результат деления — 1.0.
Теперь давайте разберем другой пример. Напишем условие assert для проверки корректности строки.
Можно привести и альтернативный вариант примера со строкой:
Значение переменной val – hello. Это означает, что условие ложно, и программа выведет ошибку AssertionError с нашим комментарием — «The variable value is not equal to Pythonist».
Заключение
Оператор assert – это встроенный оператор в Python, позволяющий отлаживать код. Этот оператор принимает условие и необязательное сообщение, которое выводится, если условие assert ложно. В этом случае инструкция assert выводит AssertionError. Если условие истинно, то ничего не происходит и выполняется следующая строка кода. В этой статье мы подробно объяснили принцип работы оператора assert и разобрали его на примерах.
Функция assert в Python
В этом руководстве мы узнаем о ключевом слове assert в python. Он помогает нам отлаживать код. Если вы хотите смоделировать свой код, вы можете использовать в своем коде инструкции assert.
Ниже приведена базовая структура:
Вы также можете отправить информацию с оператором assert для лучшего понимания ошибки кода.
Ниже приведен способ отправки сообщения с помощью assert:
Утверждение Assert
Оператор assert в Python принимает условие, которое должно быть true. Если условие true, это означает, что утверждение значения переменной в порядке, тогда программа будет работать исправно, и будут выполнены следующие операторы. Но если условие false (это означает, что в нашем коде есть ошибка), возникает исключение.
Пример функции, которая возвращает частное от двух чисел
Мы хотим написать функцию, которая будет возвращать частное от двух чисел. Вот код:
Если мы запустим приведенный выше код, то результат будет следующим:
В третьей строке приведенного выше кода вы можете увидеть инструкцию assert. В этой строке проверяется, больше ли значение переменной num 2 0 или нет. Если больше нуля, т.е. условие true, то проблем не возникает, и мы получаем результат соответственно.
Но когда мы вызвали функцию Division() со вторым аргументом 0, тогда условие assert – false. Вот почему возникает AssertionError, и выдается сообщение «Divisor не может быть нулевым», которое мы написали в части сообщения.
Пример с заменой переменной
Рассмотрим следующий код, мы пытаемся найти квадратный корень из уравнения, скажем (b2 – 4ac).
Вот как мы можем использовать оператора assert для отладки и поиска ошибок в нашем коде на этапе тестирования. Вы можете узнать больше о тестировании кода, используя модуль unitest.
# assert в Python
Инструкция assert применяется для автоматического обнаружения ошибок в программах Python. Эта инструкция сделает ваши программы надежнее и проще в отладке.
По своей сути инструкция assert представляет собой средство отладки, которое проверяет условие. Если условие утверждения assert истинно, то ничего не происходит и ваша программа продолжает выполняться как обычно. Но если же вычисление условия дает результат ложно, то вызывается исключение AssertionError с необязательным сообщением об ошибке.
Пример использования assert
Предположим, вы создаете интернет-магазин с помощью Python. Вы работаете над добавлением в систему функциональности скидочного купона, и в итоге вы пишете следующую функцию apply_discount() :
Инструкция assert будет гарантировать, что, независимо от обстоятельств, вычисляемые этой функцией сниженные цена не может быть ниже 0 и выше первоначальной цены товара.
Давайте убедимся, что эта функция действительно работает как задумано, если вызвать ее, применив допустимую скидку. В этом примере товары в нашем магазине будут представлены в виде простых словарей, для демонстрации утверждений assert :
Избегая проблем с округлением денежной цены, используйте целое число для представления цены в копейках. Итак, если к этим туфлям мы применим 25 %-ную скидку, то ожидаемо придем к отпускной цене 112,49:
Функция сработала. Теперь попробуем применить несколько недопустимых скидок. Например, 200%-ную «скидку», которая вынудит нас отдать деньги покупателю:
Видно отчет об этом исключении и то, как он указывает на точную строку исходного кода, содержащую вызвавшее сбой утверждение. Если во время проверки интернет-магазина вы (или другой разработчик в вашей команде) когда-нибудь столкнетесь с одной из таких ошибок, вы легко узнаете, что произошло, просто посмотрев на отчет об обратной трассировке исключения.
# Почему не применить обычное исключение?
Теперь подумаем, почему в предыдущем примере просто не применить инструкцию if и исключение.
Дело в том, что инструкция assert предназначена для того, чтобы сообщать разработчикам о неустранимых ошибках в программе. Инструкция assert не предназначена для того, чтобы сигнализировать об ожидаемых ошибочных условиях, таких как ошибка «Файл не найден», где пользователь может предпринять корректирующие действия или просто попробовать еще раз.
Инструкции призваны быть внутренними самопроверками (internal selfchecks) вашей программы. Они работают путем объявления неких условий, возникновение которых в вашем исходном коде невозможно. Если одно из таких условий не сохраняется, то это означает, что в программе есть ошибка.
А пока имейте в виду, что инструкция assert — это средство отладки, а не механизм обработки ошибок исполнения программы. Цель использования инструкции assert состоит в том, чтобы позволить разработчикам как можно скорее найти вероятную первопричину ошибки. Если в вашей программе ошибки нет, то исключение AssertionError никогда не должно возникнуть.
Прежде чем вы начнете применять какое-то функциональное средство языка, всегда неплохо подробнее познакомиться с тем, как оно практически реализуется в Python. Поэтому давайте бегло взглянем на синтаксис инструкции assert в соответствии с документацией Python
Во время исполнения программы интерпретатор Python преобразовывает каждую инструкцию assert примерно в следующую ниже последовательность инструкций:
В этом фрагменте кода есть две интересные детали.
Конечно это ужасно, но этот прием определенно допустим и полезен, если в одном из своих приложений вы сталкиваетесь с плавающей ошибкой.
# Ловушки assert
Есть два важных предостережения, на которые стоит обратить внимание:
Звучит довольно ужасно (и потенциально таковым и является), поэтому вам, вероятно, следует как минимум просмотреть эти два предостережения хотя бы бегло.
Не используйте инструкции assert для проверки данных!
Это превращает любую инструкцию assert в нулевую операцию: утверждения assert просто компилируются и вычисляться не будут, это означает, что ни одно из условных выражений не будет выполнено.
Это преднамеренное проектное решение, которое используется схожим образом во многих других языках программирования. В качестве побочного эффекта оно приводит к тому, что становится чрезвычайно опасно использовать инструкции assert в виде быстрого и легкого способа проверки входных данных.
Поясню: если в вашей программе утверждения assert используются для проверки того, содержит ли аргумент функции «неправильное» или неожиданное значение, то это решение может быстро обернуться против вас и привести к ошибкам или дырам с точки зрения безопасности.
Давайте взглянем на простой пример, который демонстрирует эту проблему. И снова представьте, что вы создаете приложение Python с интернет-магазином. Где-то среди программного кода вашего приложения есть функция, которая удаляет товар по запросу пользователя.
В этом примере трехстрочной функции есть две серьезные проблемы, и они вызваны неправильным использованием инструкций assert :
Проверка полномочий администратора инструкциями assert несет в себе опасность. Если утверждения assert отключены в интерпретаторе Python, то проверка полномочий превращается в нулевую операцию. И поэтому теперь любой пользователь может удалять товары. Проверка полномочий вообще не выполняется. В результате повышается вероятность того, что может возникнуть проблема, связанная с обеспечением безопасности, и откроется дверь для атак, способных разрушить или серьезно повредить данные в нашем интернет-магазине. Очень плохо.
Проверка has_product() пропускается, когда assert отключена. Это означает, что метод get_product() теперь можно вызывать с недопустимыми идентификаторами товаров, что может привести к более серьезным ошибкам, — в зависимости от того, как написана наша программа. В худшем случае она может стать началом запуска DoS-атак. Например, если приложение магазина аварийно завершается при попытке стороннего лица удалить неизвестный товар, то, скорее всего, это произошло потому, что взломщик смог завалить его недопустимыми запросами на удаление и вызвать сбой в работе сервера.
Каким образом можно избежать этих проблем? Ответ таков: никогда не использовать утверждения assert для выполнения валидации данных. Вместо этого можно выполнять проверку обычными инструкциями if и при необходимости вызывать исключения валидации данных, как показано ниже:
Когда в инструкцию assert в качестве первого аргумента передается кортеж, assert всегда возвращает True и по этой причине выполняется успешно.
Например, это утверждение никогда не будет давать сбой:
Более свежие версии Python 3 для таких сомнительных инструкций assert показывают синтаксическое предупреждение.
Между прочим, именно поэтому всегда следует выполнять быстрый тест при помощи своих модульных тестовых случаев. Прежде чем переходить к написанию следующего, убедитесь, что они действительно не срабатывают.
Несмотря на данные выше предостережения, я полагаю, что инструкции assert являются мощным инструментом отладки, который зачастую недостаточно используется разработчиками Python.
Понимание того, как работают инструкции assert и когда их применять, поможет писать программы Python, которые будет легче сопровождать и отлаживать.
Это великолепный навык, который стоит освоить, чтобы прокачать знания Python до более качественного уровня и стать всесторонним питонистом.Это позволит сэкономить бесконечные часы, которые приходится тратить на отладку.
Инструкция assert — это средство отладки, которое проверяет условие, выступающее в качестве внутренней самопроверки вашей программы.
Инструкции assert должны применяться только для того, чтобы помогать разработчикам идентифицировать ошибки. Они не являются механизмом обработки ошибок периода исполнения программы.
Инструкции assert могут быть глобально отключены в настройках интерпретатора.
№35 Инструкция assert / для начинающих
Инструкции assert в Python — это булевы выражения, которые проверяют, является ли условие истинным ( True ). Они определяют факты (утверждения) в программе. Assertion — это проверка, которую можно включить, а затем выключить, завершив тестирование программы.
Возьмем простой пример функции деления. Можно быть уверенным в том, что делитель не должен быть нолем. Это и указывается при тестировании. Разберем этот пример позже.
Что такое Assertion (утверждение)
Assertions (утверждения) — это инструкции, которые «утверждают» определенный кейс в программе. В Python они выступают булевыми выражениями, которые проверяют, является ли условие истинным или ложным. Если оно истинно, то программа ничего не делает и переходит к выполнению следующей строчки кода.
Но если оно ложно, то программа останавливается и возвращает ошибку.
Следующий синтаксис — это базовая структура инструкций утверждения в Python.
Если же нужно добавить сообщение для вывода при ложном условии, то синтаксис будет таким.
Это сообщение позволит лучше понять, почему код не сработал.
Пример assert
Если нужно симулировать или выполнить отладку кода, чтобы узнать, что именно происходит на определенном этапе, то «утверждения» в Python отлично для этого подходят.
Именно инструмент отладки останавливает программу, как только возникает какая-то ошибка. Он также показывает, где именно она произошла.
Assert в Python с примерами для начинающих
С помощью инструкций assert в Python мы можем проверить условие на истинность, передав им факты (утверждения) приложения. Эту проверку можно как включить, так и выключить, закончив тестирование приложения. Для примера возьмем функцию деления. Здесь перед выполнением операции необходимо убедиться в том, что число не делится на ноль. При тестировании это указывается. Немного позже разберем этот пример.
Assertion – что это в Python?
Если проверка проходит успешно, интерпретатор больше ничего не делает, и просто переходит к следующему блоку кода. В случае ложности этого утверждения выполнение приложения останавливается с исключением. Инструкции утверждения в Python имеют следующий синтаксис.
Тогда будут более понятны причины неудачи при исполнении кода.
Инструкция assert на примере
Утверждения могут использоваться для проверки того, что происходит в определенный момент исполнения программы. То есть, это действенный инструмент отладки кода или его симуляции.
Как раз инструмент отладки и останавливает выполнение программы в случае возникновения ошибки и показывает, где возникло исключение.
Итак, что вам нужно знать о инструкции assert?
Как же работают утверждения в Python? Вот пример кода, в котором они используются.
Обратите внимание: в этом примере поля не могут быть пустыми. В ином случае возвращается ошибка Assertion Error.
Пример вывода приложения:
А теперь давайте попробуем не передавать никаких значений.
Тем не менее, в описанном выше примере нужное сообщение при ошибке не возвращается. Чтобы исправить эту проблему, его нужно написать самостоятельно. Делается это следующим образом.
Видим, что во втором аргументе инструкции была использована фраза « Список ranks не может быть пустым».
Соответственно, вывод будет следующим.
Сообщения об ошибке в Assert
Давайте теперь приведем пример, который мы обещали привести ранее. А именно, деление на 0.
Здесь, как видим, во втором выражении число 21 делится на 0. Сначала программа попыталась разделить 21 на 3. Это у нее получилось, и было выдано значение 7.0.
А после этого возникло исключение «Нельзя делить на 0».
Инструкция assert написана на второй сверху строке. Здесь выполняется проверка, является ли вторая переменная функции нулем. Если нет, то такое условие является истинным. Следовательно, код идет далее.
Методы assert
Давайте теперь приведем таблицу с методами, которые могут быть использованы для инструкции assert.
Проверка функции на предмет возврата исключения
Если запустить такой код, мы получим следующий вывод.
Какие ошибки самые частые у начинающих разработчиков?
Утверждения в Python – несложная тема. Тем не менее, необходимо учитывать такие моменты, которые касаются ее:
Обработка ошибок
Вообще, исключения – это отдельный тип данных, предназначенный для сообщения разработчику об ошибке.
Давайте приведем пример использования этой конструкции.
К слову, в этом примере мы использовали стандартный тип исключения ZeroDivisionError, не создавая отдельного утверждения для этого. Но логика обработки любых ошибок одинаковая.
Также можно использовать инструкцию except без аргументов. В таком случае она будет перехватывать абсолютно все ошибки. Правда, такая форма редко используется, поскольку перехватываются абсолютно все исключения, в том числе, и системный выход, прерывание с клавиатуры.
Ключевые моменты assert в Python
Итак, давайте подведем итоги:
Таким образом, мы разобрались, как генерировать исключения в случае, если какое-то условие оказывается ложным.