Я читал некоторый исходный код, и в нескольких местах я видел использование assert
.
Что это значит? Каково его использование?
Я читал некоторый исходный код, и в нескольких местах я видел использование assert
.
Что это значит? Каково его использование?
Утверждение 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
Смотрите здесь для соответствующей документации.
Следите за круглыми скобками. Как было указано выше, в 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__
становится False, и условия будут перестаньте оценивать. Эта функция также может вас поймать, если вы полагаетесь на утверждения и не понимаете, что они исчезли.
Другие уже дали вам ссылки на документацию.
Вы можете попробовать следующее в интерактивной оболочке:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
Первое утверждение ничего не делает, а второе вызывает исключение. Это первая подсказка: утверждения полезны для проверки условий, которые должны быть истинными в заданной позиции вашего кода (обычно, начало (предусловия) и конец функции (постусловия)).
Утверждения на самом деле тесно связаны с программированием по контракту, что является очень полезной инженерной практикой:
Целью утверждения в Python является информирование разработчиков о неустранимых ошибках в программе.
Утверждения не предназначены для сигнализации ожидаемых условий ошибки, таких как "файл не найден", когда пользователь может предпринять корректирующие действия (или просто повторить попытку).
Еще один способ взглянуть на это - сказать, что в вашем коде утверждают внутренние самопроверки. Они работают, объявив некоторые условия невозможными в вашем коде. Если эти условия не выполняются, это означает, что в программе есть ошибка.
Если ваша программа без ошибок, эти условия никогда не будут происходить. Но если один из них произойдет, программа выйдет из строя с ошибкой утверждения, которая сообщит вам, какое именно "невозможное" условие было вызвано. Это значительно облегчает отслеживание и исправление ошибок в ваших программах.
Получает резюме из учебник по утверждениям Pythons Я написал:
Оператор утверждения Pythons - это средство отладки, а не механизм обработки ошибок во время выполнения. Цель использования утверждений - дать разработчикам возможность быстрее найти вероятную основную причину ошибки. Ошибка утверждения никогда не должна повышаться, если в вашей программе нет ошибки.
Утверждающий оператор имеет две формы.
Простая форма 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
если утверждение 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
Как кратко изложено на C2 Wiki:
Утверждение - это логическое выражение в определенной точке программы, которое будет истинным, если в программе нет ошибки.
Вы можете использовать оператор assert
для документирования вашего понимания кода в конкретной программной точке. Например, вы можете задокументировать предположения или гарантии относительно входных данных (предварительных условий), состояния программы (инвариантов) или выходных данных (постусловий).
Если ваше утверждение когда-либо не удастся, это предупреждение для вас (или вашего преемника), что вы неправильно поняли программу, когда вы ее написали, и что она, вероятно, содержит ошибку.
Для получения дополнительной информации у Джона Регера есть замечательное сообщение в блоге об использовании утверждений, которое также применимо к утверждению Python assert
.
Если вы хотите точно знать, что делает зарезервированная функция в 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
Здесь discounts_price никогда не может быть меньше 0 и больше фактической цены. Таким образом, в случае нарушения вышеуказанного условия assert вызывает ошибку утверждения, которая помогает разработчику определить, что произошло нечто невозможное.
Надеюсь, поможет :)
Мое краткое объяснение:
assert
вызывает AssertionError
если выражение равно false, в противном случае просто продолжает код, и если есть запятая, какой бы она ни была, это будет AssertionError: whatever after comma
, а для кода это похоже: raise AssertionError(whatever after comma)
Связанный учебник об этом:
https://www.tutorialspoint.com/python/assertions_in_python.htm
Ярлыки для grok 'assert'.
assert
выполняет функцию контрольной точки,
Если он хорошо работает, продолжайте:
в противном случае вызывать предупреждение.
Утверждение 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
является случай, когда программа проверяет условие и возвращает значение, которое должно немедленно остановить программу, вместо того, чтобы использовать какой-либо альтернативный способ обойти ошибку:
Как вы могли заметить, оператор 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.
Если вам интересно, когда использовать 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
Крайне важно не полагаться на оператор assert
для выполнения обработки данных или проверки данных, поскольку этот оператор можно отключить при инициализации Python с помощью -O
или -OO
- означающего значения 1, 2 и 0 (как по умолчанию), соответственно - или переменная окружения PYTHONOPTIMIZE
.
Значение 1:
* утверждения отключены;
* файлы байт-кода генерируются с использованием расширения .pyo
вместо .pyc
;
* sys.flags.optimize
имеет значение 1 (True
);
* и __debug__
имеет значение False
;
Значение 2: отключает еще один материал
* строки документов отключены;
Поэтому использование оператора assert
для проверки ожидаемых данных чрезвычайно опасно, что подразумевает даже некоторые проблемы безопасности. Затем, если вам нужно подтвердить какое-то разрешение, я рекомендую вместо этого raise AuthError
. Как предварительное условие, assert
обычно используется программистами в библиотеках или модулях, в которых пользователь не взаимодействует напрямую.
: 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!
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
Может использоваться для обеспечения передачи параметров в вызове функции.
>>>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 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