Skip to content

Latest commit

 

History

History
81 lines (65 loc) · 6.6 KB

README_assert.md

File metadata and controls

81 lines (65 loc) · 6.6 KB

assert может быть использован для проверок, которые не сводятся к простым арифметическим выражениям. Вот несколько нетривиальных, но типичных примеров использования assert:

Проверка наличия элементов в списке или другой коллекции:

my_list = [1, 2, 3, 4, 5]
assert 6 not in my_list, "Элемент 6 не должен быть в списке"

В этом примере, assert проверяет, что элемент 6 не находится в списке my_list. Если бы он был в списке, это бы считалось ошибкой.

Проверка размера коллекции:

my_dict = {"name": "John", "age": 30, "city": "New York"}
assert len(my_dict) == 3, "Словарь должен содержать 3 элемента"

Здесь assert проверяет, что в словаре my_dict ровно 3 элемента. Если бы было больше или меньше элементов, это считалось бы ошибкой.

Проверка размера коллекции:

my_dict = {"name": "John", "age": 30, "city": "New York"}
assert len(my_dict) == 3, "Словарь должен содержать 3 элемента"

Проверка состояния объекта или класса:

class Circle:
def __init__(self, radius):
    self.radius = radius
    assert self.radius > 0, "Радиус должен быть положительным числом"

c1 = Circle(5)
c2 = Circle(-2)  # Это вызовет AssertionError из-за отрицательного радиуса.

Здесь assert используется в конструкторе класса Circle для проверки того, что радиус круга положителен.

class Circle:
def __init__(self, radius):
    self.radius = radius
    try:
        assert self.radius > 0, "Радиус должен быть положительным числом"
    except AssertionError as e:
        print(f"Произошла ошибка: {e}")
        # Другие действия при ошибке

c1 = Circle(5)
c2 = Circle(-2)

В этом случае, если при создании объекта c2 будет задан отрицательный радиус, то assert вызовет исключение AssertionError, но оно будет обработано блоком except, который выведет сообщение об ошибке и выполнит другие действия, которые вы можете указать внутри блока except.

Проверка значений на равенство с плавающей точкой с допустимой погрешностью:

import math
x = 0.1 + 0.1 + 0.1
assert math.isclose(x, 0.3, rel_tol=1e-9), "x должно быть приблизительно равно 0.3"

В случае с плавающей точкой, точное равенство может вызвать проблемы из-за ограничений представления чисел с плавающей точкой. Вместо этого, мы используем math.isclose() с допустимой относительной погрешностью.

Использование конструкции с try...except и оператором assert имеет свои преимущества по сравнению с использованием условного оператора if...else для проверки условий в некоторых ситуациях:

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

Легкость отладки: Если вы используете assert с сообщением об ошибке, то при сбое проверки (когда условие не выполняется) вы получите подробное сообщение об ошибке с указанием, что пошло не так и какое именно условие не выполнено. Это упрощает отладку и нахождение места, где произошла ошибка.

Упрощение кода: Иногда использование assert может упростить код, особенно если проверка является неотъемлемой частью логики класса или функции. Проверки, вставленные с помощью assert, могут быть убраны из финальной версии программы с использованием опции -O интерпретатора Python, что уменьшит накладные расходы при работе программы.

Однако есть и недостатки в использовании assert:

Выключение оптимизации: Если оптимизация выключена (-O), то все операторы assert игнорируются, и проверки не выполняются, что может привести к пропуску ошибок в коде.

Применимость: assert лучше всего подходит для проверок, которые должны выполняться всегда, и которые являются частью контракта или спецификации вашей функции или класса. Если проверка предназначена для обработки ошибок, которые могут возникнуть в нормальной работе программы, то использование if...else более подходящее.

Итак, выбор между assert и if...else зависит от вашей конкретной ситуации и требований к коду.