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



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

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

461   17  

17 ответов:

The 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

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

To если утверждение не выполняется, выведите сообщение:

assert False, "Oh no! This assertion failed!"

при работе python в оптимизированном режиме, где __debug__ и False, утверждения будут игнорироваться. Просто передайте -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 игнорируются при компиляции кода с опцией оптимизация. Элемент документация говорит, что 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!
>>> 

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

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 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 делает отладку очень простой, когда ваш код попадает в невозможные крайние случаи. Утверждают, что проверяют эти невозможные случаи.

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

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

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

надеюсь, что это помогает :)

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

  • assert поднимает AssertionError если выражение ложно, в противном случае просто продолжает код, и если есть запятая, что бы это ни было, это будет 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

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

: утверждение выражения [, аргументы] Когда заявлять о встречах с заявлением,в 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
    Ничего не найдено.

Добавить ответ:
Отменить.