Что такое использование "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:

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

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

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


цель утверждения в 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