№35 Инструкция assert / для начинающих

Предыдущий урок: Потоки и многопоточность

Инструкции assert в Python — это булевы выражения, которые проверяют, является ли условие истинным (True). Они определяют факты (утверждения) в программе. Assertion — это проверка, которую можно включить, а затем выключить, завершив тестирование программы.

Возьмем простой пример функции деления. Можно быть уверенным в том, что делитель не должен быть нолем. Это и указывается при тестировании. Разберем этот пример позже.

Что такое Assertion (утверждение)

Assertions (утверждения) — это инструкции, которые «утверждают» определенный кейс в программе. В Python они выступают булевыми выражениями, которые проверяют, является ли условие истинным или ложным. Если оно истинно, то программа ничего не делает и переходит к выполнению следующей строчки кода.

Но если оно ложно, то программа останавливается и возвращает ошибку.

Следующий синтаксис — это базовая структура инструкций утверждения в Python.

assert condition

Если же нужно добавить сообщение для вывода при ложном условии, то синтаксис будет таким.

assert condition, message

Это сообщение позволит лучше понять, почему код не сработал.

Пример assert

Если нужно симулировать или выполнить отладку кода, чтобы узнать, что именно происходит на определенном этапе, то «утверждения» в Python отлично для этого подходят.

Именно инструмент отладки останавливает программу, как только возникает какая-то ошибка. Он также показывает, где именно она произошла.

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

Вот пример работы утверждений в Python.


def avg(ranks):
assert len(ranks) != 0
return round(sum(ranks)/len(ranks), 2)

ranks = [62, 65, 75]
print("Среднее значение:", avg(ranks))

В этом примере нужно, чтобы пользователь не оставлял параметры пустыми. Если этого не сделать, вернется ошибка Assertion Error. Вот пример вывода:

Среднее значение: 67.33

В этом случае параметры были переданы, поэтому функция вернула нужный результат.

Теперь попробуем ничего не передавать.


def avg(ranks):
assert len(ranks) != 0
return round(sum(ranks)/len(ranks), 2)

ranks = []
print("Среднее значение:", avg(ranks))

Длина массива ranks оказалась 0, и python вернул ошибку Assertion Error.

Traceback (most recent call last):
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 6, in <module>
    print("Среднее значение:", avg(ranks))
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 2, in avg
    assert len(ranks) != 0
AssertionError

Исключения Assertion Error можно перехватывать и обрабатывать как и любые другие исключения с помощью try-except. Но если их обработать неправильно, то программа остановится и вернет traceback.

Однако в примере выше она не возвращает ошибку с нужным сообщением. Ее можно написать самостоятельно. Вот как это делается.


def avg(ranks):
assert len(ranks) != 0, 'Список ranks не должен быть пустым'
return round(sum(ranks)/len(ranks), 2)

ranks = []
print("Среднее значение:", avg(ranks))

Вторым аргументом к assert в примере выше было передано сообщение, которое позже появится в выводе.

Traceback (most recent call last):
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 6, in <module>
    print("Среднее значение:", avg(ranks))
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 2, in avg
    assert len(ranks) != 0, 'Список ranks не должен быть пустым'
AssertionError: Список ranks не должен быть пустым

Assert с сообщением об ошибки

Рассмотрим еще один пример с делением на 0.


def divide(x, y):
assert y != 0 , 'Нельзя делить на 0'
return round(x/y, 2)

z = divide(21,3)
print(z)

a = divide(21,0)
print(a)

В этом примере, если делителем будет ноль, то assert вернет сообщение с ошибкой. Посмотрим на вывод.

7.0
Traceback (most recent call last):
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 8, in <module>
    a = divide(21,0)
  File "C:/Users/asd/AppData/Local/Programs/Python/Python38/wb.py", line 2, in divide
    assert y != 0 , 'Нельзя делить на 0'
AssertionError: Нельзя делить на 0

На третьей сверху строчке написана сама инструкция assert. Именно здесь проверяется, не является ли переменная y равной 0. Если она больше 0, то условие истинно, и код возвращает требуемый результат.

Но если вызвать метод division() со вторым аргументом 0, то условие assert будет ложным.

По этой причине и возникает исключение Assertion Error. Именно оно возвращает ошибку с сообщением «Нельзя делить на 0».

Методы assert


Метод

Проверка на

Работает с

assertEqual(x, y)

x == y

assertNotEqual(x, y)

x != y

assertTrue(x)

bool(x) равно True

assertFalse(x)

bool(x) равно False

assertIs(x, y)

x это y

3.1

assertIsNot(x, y)

x это не y

3.1

assertIsNone(x)

x это None

3.1

assertIsNotNone(x)

x это не None

3.1

assertIn(x, y)

x в y

3.1

assertNotIn(x, y)

x не в y

3.1

assertIsInstance(x, y)

isinstance(x, y)

3.2

assertNotIsInstance(x,y)

не isinstance(x, y)

3.2

Как проверить, что функция возвращает исключение

Можно использовать TestCase.assertRaises (или TestCase.failUnlessRaises) из модуля unittest.


import unittest

def broken_function():
raise Exception('Это ошибка')

class MyTestCase(unittest.TestCase):
def test(self):
with self.assertRaises(Exception) as context:
broken_function()

self.assertTrue('Это ошибка' in str(context.exception))

if __name__ == '__main__':
unittest.main()

Вывод:

.
----------------------------------------------------------------------
Ran 1 test in 0.051s

OK

Распространенные ошибки

Есть два важных момента касательно утверждений в Python, о которых нужно помнить.

  1. Не стоит использовать assert для валидации данных, ведь это приводит к появлению проблем с безопасностью и багов.
  2. Важно не писать такие утверждения, которые всегда будут истинными.

Ключевые моменты assert в Python

  1. Утверждение (Assertion) — это условие или булево выражение, которое должно быть истинным.
  2. Инструкция assert принимает выражение и необязательное сообщение.
  3. Инструкция assert используется для проверки типов, значений аргументов и вывода функций.
  4. Это также инструмент для отладки, ведь он останавливает программу при появлении ошибки.
  5. В первую очередь утверждения используются для уведомления разработчиков о неотслеживаемых ошибках. Они не должны сообщать об условия ошибок, таких как «файл не был найден», где пользователь может попытаться исправиться и повторить действия.
  6. Утверждения — это внутренняя проверка для программы. Они работают за счет объявления невозможных условий в коде. Если эти условия не проходят, значит имеется баг.

Предыдущий урок: Namedtuple

Появились вопросы? Задайте на Яндекс Кью

У блога есть сообщество на Кью >> Python Q <<. Там я и другие участники отвечаем на вопросы по python, программированию и контенту сайта.

Обучение Python и Data Science

Профессия Python-разработчик / Skillbox

Профессия Python-разработчик / Skillbox

7 313 2 925 ₽/мес.
Профессия Python Fullstack / Skillbox

Профессия Python Fullstack / Skillbox

6 569 2 627 ₽/мес.
Профессия Data Scientist / Skillbox

Профессия Data Scientist / Skillbox

9 187 3 675 ₽/мес.
Python-фреймворк на Django / Skillbox

Python-фреймворк на Django / Skillbox

818 ₽/мес.
Профессия DS: машинное обучение / Skillbox

Профессия DS: машинное обучение / Skillbox

6172 2469 ₽/мес.
Профессия DS: анализ данных / Skillbox

Профессия DS: анализ данных / Skillbox

6172 2469 ₽/мес.

Вам помогла эта статья? Поделитесь в соцсетях или блоге. Репосты помогают сайту развиться.

Александр эксперт Яндекс.Кью
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: