Что такое использование "assert" в Python?
Я читал некоторый исходный код, и в нескольких местах я видел использование assert
.
что это значит? Каково его использование?
17 ответов
на assert
оператор существует почти в каждом языке программирования. Когда ты это сделаешь...
assert condition
... вы говорите программе проверить это условие и вызвать ошибку, если условие ложно.
в Python, это примерно эквивалентно этому:
if not condition:
raise AssertionError()
попробуйте в оболочке Python:
>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
утверждения могут включать необязательное сообщение, и вы можете отключить их при запуске интерпретатора.
для печать сообщения при сбое утверждения:
assert False, "Oh no! This assertion failed!"
при работе python
в оптимизированном режиме, где __debug__
is False
, утверждения assert будут проигнорированы. Просто передайте -O
флаг:
python -O script.py
посмотреть здесь для соответствующей документации.
следите за скобки. Как было указано выше, в Python 3, assert
еще заявление, так что по аналогии с print(..)
, можно экстраполировать то же самое на assert(..)
или raise(..)
но вы не должны.
это важно, потому что:
assert(2 + 2 == 5, "Houston we've got a problem")
не будет работать, в отличие от
assert 2 + 2 == 5, "Houston we've got a problem"
Причина первая не будет работать, заключается в том, что bool( (False, "Houston we've got a problem") )
оценивает в True
.
в заявлении assert(False)
, это просто избыточные скобки False
, которые оценивают их содержание. Но с assert(False,)
скобки теперь являются кортежем, а непустой кортеж оценивается в True
в логическом контексте.
как отметили другие ответы,assert
аналогично созданию исключения, если заданное условие неверно. Важным отличием является то, что операторы assert игнорируются при компиляции кода с опцией оптимизация. The документация говорит, что assert expression
можно лучше описать как эквивалент
if __debug__:
if not expression: raise AssertionError
это может быть полезно, если вы хотите тщательно протестировать свой код, а затем выпустить оптимизированную версию, когда вы счастливы, что ни один из ваших случаи утверждения терпят неудачу - когда оптимизация включена,__debug__
переменная становится ложной, и условия перестанут оцениваться. Эта функция также может поймать вас, если вы полагаетесь на утверждения и не понимаете, что они исчезли.
другие уже дали вам ссылки на документацию.
вы можете попробовать следующее в интерактивную оболочку:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
первый оператор ничего не делает, в то время как второй вызывает исключение. Это первый намек: утверждения полезны для проверки условий, которые должны быть истинными в данной позиции вашего кода (обычно, начало (предварительные условия) и конец функции (постусловия)).
утверждения на самом деле сильно привязаны к программированию контракт, который является очень полезной инженерной практикой:
цель утверждения в Python-информировать разработчиков о невозвратными ошибки в программе.
утверждения не предназначены для сигнализации ожидаемых условий ошибки, таких как" файл не найден", где пользователь может предпринять корректирующие действия (или просто повторите попытку).
другой способ взглянуть на это-сказать, что утверждения внутренние самопроверки в коде. Они работают, объявляя некоторые условия как невозможно в вашей код. Если эти условия не выполняются, это означает, что в программе есть ошибка.
Если ваша программа не содержит ошибок, эти условия никогда не возникнут. Но если один из них тут произойдет сбой программы с ошибкой утверждения, сообщающей вам, какое именно" невозможное " условие было вызвано. Это значительно упрощает отслеживание и исправление ошибок в ваших программах.
вот резюме от учебник по утверждениям Python I написал:
оператор assert Python-это средство отладки, а не механизм обработки ошибок во время выполнения. цель использования утверждений-позволить разработчикам быстрее найти вероятную первопричину ошибки. Ошибка утверждения никогда не должна возникать, если в вашей программе нет ошибки.
утверждение assert имеет две формы.
простая форма, assert <expression>
, эквивалентной
if __debug__:
if not <expression>: raise AssertionError
расширенная форма, assert <expression1>, <expression2>
, эквивалентной
if __debug__:
if not <expression1>: raise AssertionError, <expression2>
утверждения-это систематический способ проверить, что внутреннее состояние программы соответствует ожиданиям программиста, с целью обнаружения ошибок. См. пример ниже.
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
из docs:
Assert statements are a convenient way to insert debugging assertions into a program
можно подробнее: http://docs.python.org/release/2.5.2/ref/assert.htmlвот простой пример, сохраните это в файле (скажем, b.py)
def chkassert(num):
assert type(num) == int
chkassert('a')
и в результате, когда $python b.py
Traceback (most recent call last):
File "b.py", line 5, in <module>
chkassert('a')
File "b.py", line 2, in chkassert
assert type(num) == int
AssertionError
если утверждение после assert истинно, то программа продолжает, Но если утверждение после assert ложно, то программа выдает ошибку. Просто.
например:
assert 1>0 #normal execution
assert 0>1 #Traceback (most recent call last):
#File "<pyshell#11>", line 1, in <module>
#assert 0>1
#AssertionError
Если вы хотите точно знать, что делает зарезервированная функция в python, введите help(enter_keyword)
убедитесь, что при вводе зарезервированного ключевого слова вы вводите его как строку.
Python assert это в основном отладочная помощь, которая тестовое условие для внутренней самоконтроля вашего кода. Assert упрощает отладку, когда ваш код попадает в невозможные крайние случаи. Assert проверяет эти невозможные случаи.
допустим, есть функция для расчета цены товара после скидки:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
здесь discounted_price никогда не может быть меньше 0 и больше фактической цены. Итак, в случае нарушения вышеуказанного условия assert вызывает ошибку утверждения, которая помогает разработчику определить, что произошло что-то невозможное.
надеюсь, что это помогает :)
мое краткое объяснение:
-
assert
поднимаетAssertionError
если выражение false, в противном случае просто продолжает код, и если есть запятая, что бы это ни было, это будетAssertionError: whatever after comma
, и код такой:raise AssertionError(whatever after comma)
соответствующий учебник об этом:
https://www.tutorialspoint.com/python/assertions_in_python.htm
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
может использоваться для обеспечения передачи параметров в вызове функции.
: утверждают, выражение[,аргументы] Когда assert встречает оператор, Python оценивает выражение.Если утверждение неверно, возникает исключение(assertionError). Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключения AssertionError могут быть пойманы и обработаны как любое другое исключение с помощью оператора try-except, но если они не обработаны, они завершат программу и произведут отладочные сообщения. Пример:
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
когда приведенный выше код выполняется, он дает следующий результат:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)
>>> #first we try without assert
>>>if test_us == True:
print("YES! I am right!")
else:
print("I am Wrong, but the program still RUNS!")
I am Wrong, but the program still RUNS!
>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
assert test_us
AssertionError
>>>
в основном значение ключевого слова assert заключается в том, что если условие неверно, то оно через assertionerror иначе оно продолжается, например, в python.
код-1
a=5
b=6
assert a==b
выход:
assert a==b
AssertionError
код-2
a=5
b=5
assert a==b
выход:
Process finished with exit code 0