Оператор assert
существует практически на каждом языке программирования.Это помогает обнаруживать проблемы в начале вашей программы, где причина ясна, а не позже, как побочный эффект какой-либо другой операции.Они всегда ожидают условия True
.
Когда вы делаете что-то вроде:
assert condition
Вы говорите программе протестировать это условие и немедленно вызвать ошибку, если оно ложно.
В Python assert
выражение эквивалентно:
if __debug__:
if not <expression>: raise AssertionError
Вы можете использовать расширенное выражение для передачи необязательного сообщения :
if __debug__:
if not (expression_1): raise AssertionError(expression_2)
Попробуйте это в интерпретаторе Python:
>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
Есть несколько замечаний, которые нужно увидеть перед тем, как использовать их в основном для тех, кто считает, что переключается между assert
и if
заявления.Целью использования assert
является случай, когда программа проверяет условие и возвращает значение, которое должно немедленно остановить программу, вместо того, чтобы использовать какой-либо альтернативный способ обойти ошибку:
1.Круглые скобки
Как вы могли заметить, оператор assert
использует два условия.Следовательно, не используйте круглые скобки, чтобы пометить их как один для очевидного совета.Если вы сделаете, например:
assert (condition, message)
Пример:
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
Вы будете запускать assert
с (condition, message)
, который представляет кортеж в качестве первого параметра, и этопроисходит, потому что непустой кортеж в Python равен всегда True
.Тем не менее, вы можете сделать отдельно без проблем:
assert (condition), "message"
Пример:
>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.
2.Цель отладки
Если вам интересно, когда использовать оператор assert
.Возьмите пример, используемый в реальной жизни:
* Когда ваша программа стремится контролировать каждый параметр, введенный пользователем или что-то еще:
def loremipsum(**kwargs):
kwargs.pop('bar') # return 0 if "bar" isn't in parameter
kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())
* Другой случай - математика, когда 0 или-положительный как коэффициент или константа для определенного уравнения:
def discount(item, percent):
price = int(item['price'] * (1.0 - percent))
print(price)
assert (0 <= price <= item['price']),\
"Discounted prices cannot be lower than 0 "\
"and they cannot be higher than the original price."
return price
* или даже простой пример логической реализации:
def true(a, b):
assert (a == b), "False"
return 1
def false(a, b):
assert (a != b), "True"
return 0
3.Обработка данных или проверка данных
Исключительно важно не полагаться на оператор assert
для выполнения обработки данных или проверки данных, поскольку этот оператор можно отключить при инициализации Python с помощью -O
или -OO
flag - значение 1, 2 и 0 (по умолчанию) соответственно - или PYTHONOPTIMIZE
переменная среды.
Значение 1:
* утверждения отключены;
* файлы байт-кода создаются с использованием расширения .pyo
вместо .pyc
;
* sys.flags.optimize
установлено в 1 (True
);
* и, __debug__
установлен на False
;
Значение 2: отключает еще одну вещь
* строки документов отключены;
Следовательно, использование оператора assert
для проверки ожидаемых данных чрезвычайно опасно, что подразумевает даже некоторые проблемы безопасности.Затем, если вам нужно подтвердить какое-то разрешение, я рекомендую вам raise AuthError
.Как предварительное условие, assert
обычно используется программистами в библиотеках или модулях, с которыми пользователь не взаимодействует напрямую.