Каково использование "assert" в Python?

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

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

+760
источник поделиться
20 ответов

Утверждение 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!"

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

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

python -O script.py

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

+855
источник

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

+353
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

if __debug__:
   if not expression: raise AssertionError

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

+115
источник

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

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

>>> 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.

+48
источник

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

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

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

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

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

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

+34
источник

Утверждающий оператор имеет две формы.

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

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

Расширенный вид, assert <expression1>, <expression2>, эквивалентен

if __​debug__:
    if not <expression1>: raise AssertionError, <expression2>
+17
источник

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

>>> 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!
>>> 
+14
источник

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

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

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

+12
источник

Вот простой пример, сохраните это в файле (скажем, 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
+7
источник

если утверждение after 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
+6
источник

Как кратко изложено на C2 Wiki:

Утверждение - это логическое выражение в определенной точке программы, которое будет истинным, если в программе нет ошибки.

Вы можете использовать оператор assert для документирования вашего понимания кода в конкретной программной точке. Например, вы можете задокументировать предположения или гарантии относительно входных данных (предварительных условий), состояния программы (инвариантов) или выходных данных (постусловий).

Если ваше утверждение когда-либо не удастся, это предупреждение для вас (или вашего преемника), что вы неправильно поняли программу, когда вы ее написали, и что она, вероятно, содержит ошибку.

Для получения дополнительной информации у Джона Регера есть замечательное сообщение в блоге об использовании утверждений, которое также применимо к утверждению Python assert.

+3
источник

Если вы хотите точно знать, что делает зарезервированная функция в python, введите help(enter_keyword)

Убедитесь, что вы вводите зарезервированное ключевое слово, которое вы вводите в виде строки.

+2
источник

Python assert - это, по сути, средство отладки, которое проверяет условия для внутренней самопроверки вашего кода. Assert делает отладку действительно легкой, когда ваш код попадает в невозможные крайние случаи. Утверждают, проверяют эти невозможные случаи.

Допустим, есть функция для расчета цены товара после скидки:

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

Здесь discounts_price никогда не может быть меньше 0 и больше фактической цены. Таким образом, в случае нарушения вышеуказанного условия assert вызывает ошибку утверждения, которая помогает разработчику определить, что произошло нечто невозможное.

Надеюсь, поможет :)

+1
источник

Мое краткое объяснение:

  • assert вызывает AssertionError если выражение равно false, в противном случае просто продолжает код, и если есть запятая, какой бы она ни была, это будет AssertionError: whatever after comma, а для кода это похоже: raise AssertionError(whatever after comma)

Связанный учебник об этом:

https://www.tutorialspoint.com/python/assertions_in_python.htm

+1
источник

Ярлыки для grok 'assert'.

assert выполняет функцию контрольной точки,

Если он хорошо работает, продолжайте:

в противном случае вызывать предупреждение.

0
источник

Утверждение 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 - означающего значения 1, 2 и 0 (как по умолчанию), соответственно - или переменная окружения PYTHONOPTIMIZE.

Значение 1:

* утверждения отключены;

* файлы байт-кода генерируются с использованием расширения .pyo вместо .pyc;

* sys.flags.optimize имеет значение 1 (True);

* и __debug__ имеет значение False;

Значение 2: отключает еще один материал

* строки документов отключены;

Поэтому использование оператора assert для проверки ожидаемых данных чрезвычайно опасно, что подразумевает даже некоторые проблемы безопасности. Затем, если вам нужно подтвердить какое-то разрешение, я рекомендую вместо этого raise AuthError. Как предварительное условие, assert обычно используется программистами в библиотеках или модулях, в которых пользователь не взаимодействует напрямую.

0
источник
Формат

: assert Expression [, arguments] Когда 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!    
-2
источник
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

Может использоваться для обеспечения передачи параметров в вызове функции.

-2
источник
>>>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
>>> 
-4
источник

В принципе, значение ключевого слова assert заключается в том, что если условие не является истинным, то через assertionerror else оно продолжается, например, в python.

код-1

a=5

b=6

assert a==b

OUTPUT:

assert a==b

AssertionError

код-2

a=5

b=5

assert a==b

OUTPUT:

Process finished with exit code 0
-4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос