Какая польза от "assert" в Python? - PullRequest
       106

Какая польза от "assert" в Python?

805 голосов
/ 28 февраля 2011

Я читал некоторый исходный код и в нескольких местах я видел использование assert.

Что это значит точно? Каково его использование?

Ответы [ 19 ]

917 голосов
/ 28 февраля 2011

Оператор 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!"

Do not используйте скобки для вызова assert как функции. Это утверждение. Если вы выполните assert(condition, message), вы будете запускать assert с кортежем (condition, message) в качестве первого параметра.

Что касается их отключения, при запуске python в оптимизированном режиме, где __debug__ равно False, утверждения assert будут игнорироваться. Просто передайте флаг -O:

python -O script.py

См. здесь для соответствующей документации.

368 голосов
/ 11 июня 2015

Остерегайтесь скобок.Как указывалось выше, в 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 в логическом контексте.

121 голосов
/ 28 февраля 2011

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

if __debug__:
   if not expression: raise AssertionError

Это может быть полезно, если вы хотите тщательно протестировать свой код, а затем выпустить оптимизированную версию, если вы уверены, что ни одно из ваших утверждений не сработало - когда оптимизация включена, переменная __debug__ становится False и условия будут прекратить получать оценку. Эта функция также может вас поймать, если вы полагаетесь на утверждения и не понимаете, что они исчезли.

49 голосов
/ 28 февраля 2011

Другие уже дали вам ссылки на документацию.

Вы можете попробовать следующее в интерактивной оболочке:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

Первый оператор ничего не делает, а второй вызывает исключение.Это первая подсказка: утверждения полезны для проверки условий, которые должны быть истинными в данной позиции вашего кода (обычно начало (предусловия) и конец функции (постусловия)).

Утвержденияна самом деле тесно связана с программированием по контракту, что является очень полезной инженерной практикой:

http://en.wikipedia.org/wiki/Design_by_contract.

38 голосов
/ 18 января 2017

Цель утверждения в Python - информировать разработчиков о неисправимых ошибках в программе.

Утверждения не предназначены для оповещения об ожидаемых ошибках, например, «файл не найден», когда пользователь может предпринять корректирующие действия (или просто повторить попытку).

Другой способ взглянуть на это - сказать, что утверждения - это внутренние самопроверки в вашем коде. Они работают, объявив некоторые условия как невозможные в вашем коде. Если эти условия не выполняются, это означает, что в программе есть ошибка.

Если ваша программа не содержит ошибок, эти условия никогда не возникнут. Но если один из них произойдет , произойдет сбой программы с ошибкой утверждения, сообщающей вам, какое именно «невозможное» условие было вызвано. Это значительно упрощает поиск и исправление ошибок в ваших программах.

Вот краткое изложение учебника по утверждениям Python Я написал:

Оператор Python assert является средством отладки, а не механизмом обработки ошибок во время выполнения. Цель использования утверждений состоит в том, чтобы позволить разработчикам быстрее найти вероятную основную причину ошибки. Ошибка утверждения никогда не должна возникать, если в вашей программе нет ошибки.

17 голосов
/ 10 июля 2013

Оператор assert имеет две формы.

Простая форма assert <expression> эквивалентна

if __​debug__:
    if not <expression>: raise AssertionError

Расширенная форма assert <expression1>, <expression2> эквивалентна

if __​debug__:
    if not <expression1>: raise AssertionError, <expression2>
15 голосов
/ 19 февраля 2014

Утверждения являются систематическим способом проверки того, что внутреннее состояние программы соответствует ожидаемому программистом с целью выявления ошибок.Смотрите пример ниже.

>>> 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!
>>> 
13 голосов
/ 28 февраля 2011

Из документов:

Assert statements are a convenient way to insert debugging assertions into a program

Здесь вы можете прочитать больше: http://docs.python.org/release/2.5.2/ref/assert.html

7 голосов
/ 17 февраля 2014

Вот простой пример, сохраните это в файле (скажем, 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
6 голосов
/ 01 ноября 2014

если оператор после assert равен true, то программа продолжается, но если оператор после assert равен false, программа выдает ошибку. Все просто.

например:.

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError
...