На этом шаге мы приведем небольшой пример использования инструкции assert.
Вот простой пример, чтобы дать вам понять, где утверждения assert могут пригодиться. Мы попытались предоставить вам некоторое подобие реальной задачи, с которой вы можете столкнуться на практике в одной из своих программ.
Предположим, вы создаете интернет-магазин с помощью Python. Вы работаете над добавлением в систему функциональности скидочного купона, и в итоге вы пишете следующую функцию apply_discount():
def apply_discount(product, discount): price = int(product['цена'] * (1.0 - discount)) assert 0 <= price <= product['цена'] return price
Вы заметили, что здесь есть инструкция assert? Она будет гарантировать, что, независимо от обстоятельств, вычисляемые этой функцией сниженные цены не могут быть ниже 0$ и они не могут быть выше первоначальной цены товара.
Давайте убедимся, что эта функция действительно работает как задумано, если вызвать ее, применив допустимую скидку. В этом примере товары в нашем магазине будут представлены в виде простых словарей. И скорее всего, в реальном приложении вы примените другую структуру данных, но эта безупречна для демонстрации утверждений assert. Давайте создадим пример товара - пару симпатичных туфель по цене 149,00 $:
>>> shoes = {'имя': 'Модные туфли', 'цена': 14900}
Кстати, заметили, как мы избежали проблем с округлением денежной цены, использовав целое число для представления цены в центах? В целом неплохое решение... Итак, если к этим туфлям мы применим 25%-ную скидку, то ожидаемо придем к отпускной цене 111,75$:
>>> apply_discount(shoes, 0.25)
11175
Отлично, функция сработала безупречно. Теперь давайте попробуем применить несколько недопустимых скидок. Например, 200%-ную "скидку", которая вынудит нас отдать деньги покупателю:
>>> apply_discount(shoes, 2.0)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
apply_discount(shoes, 2.0)
File "<pyshell#1>", line 3, in apply_discount
assert 0 <= price <= product['цена']
AssertionError
Как вы видите, когда мы пытаемся применить эту недопустимую скидку, наша программа останавливается с исключением AssertionError. Это происходит потому, что 200%-ная скидка нарушила условие утверждения assert, которое мы поместили в функцию apply_discount().
Вы также можете видеть отчет об обратной трассировке этого исключения и то, как он указывает на точную строку исходного кода, содержащую вызвавшее сбой утверждение. Если во время проверки интернет-магазина вы (или другой разработчик в вашей команде) когда-нибудь столкнетесь с одной из таких ошибок, вы легко узнаете, что произошло, просто посмотрев на отчет об обратной трассировке исключения.
Это значительно ускорит отладку и в дальнейшем сделает ваши программы удобнее в поддержке. А в этом как раз и заключается сила assert!
На следующем шаге мы продолжим изучение этого вопроса.