Шаг 3.
Python: тонкости программирования. Шаблоны для чистого Python. Обезопась себя инструкциями assert. Инструкция assert в Python - пример

    На этом шаге мы приведем небольшой пример использования инструкции 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!

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг