Python assert with message

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

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

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

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

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

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

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

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

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

Пример 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 . Вот пример вывода:

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

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

 
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 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 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 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()

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

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

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

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

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

Источник

Python Assert Statement

Assertions are statements that assert or state a fact confidently in your program. For example, while writing a division function, you're confident the divisor shouldn't be zero, you assert divisor is not equal to zero.

Assertions are simply boolean expressions that check if the conditions return true or not. If it is true, the program does nothing and moves to the next line of code. However, if it's false, the program stops and throws an error.

It is also a debugging tool as it halts the program as soon as an error occurs and displays it.

We can be clear by looking at the flowchart below:

Python Assert Flowchart

Python assert Statement

Python has built-in assert statement to use assertion condition in the program. assert statement has a condition or expression which is supposed to be always true. If the condition is false assert halts the program and gives an AssertionError .

Syntax for using Assert in Pyhton:

In Python we can use assert statement in two ways as mentioned above.

  1. assert statement has a condition and if the condition is not satisfied the program will stop and give AssertionError .
  2. assert statement can also have a condition and a optional error message. If the condition is not satisfied assert stops the program and gives AssertionError along with the error message.

Let's take an example, where we have a function that will calculate the average of the values passed by the user and the value should not be an empty list. We will use assert statement to check the parameter and if the length is of the passed list is zero, the program halts.

Example 1: Using assert without Error Message

def avg(marks): assert len(marks) != 0 return sum(marks)/len(marks) mark1 = [] print("Average of mark1:",avg(mark1))

When we run the above program, the output will be:

We got an error as we passed an empty list mark1 to assert statement, the condition became false and assert stops the program and give AssertionError .

Now let's pass another list which will satisfy the assert condition and see what will be our output.

Example 2: Using assert with error message

def avg(marks): assert len(marks) != 0,"List is empty." return sum(marks)/len(marks) mark2 = [55,88,78,90,79] print("Average of mark2:",avg(mark2)) mark1 = [] print("Average of mark1:",avg(mark1))

When we run the above program, the output will be:

Average of mark2: 78.0 AssertionError: List is empty.

We passed a non-empty list mark2 and also an empty list mark1 to the avg() function and we got output for mark2 list but after that we got an error AssertionError: List is empty . The assert condition was satisfied by the mark2 list and program to continue to run. However, mark1 doesn't satisfy the condition and gives an AssertionError .

Key Points to Remember

  • Assertions are the condition or boolean expression which are always supposed to be true in the code.
  • assert statement takes an expression and optional message.
  • assert statement is used to check types, values of argument and the output of the function.
  • assert statement is used as debugging tool as it halts the program at the point where an error occurs.

Table of Contents

Источник

Читайте также:  Print list comprehension python
Оцените статью