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 зависит от вашей конкретной ситуации и требований к коду.