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

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

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

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

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

Ответы [ 19 ]

3 голосов
/ 08 декабря 2018

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

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

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

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

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

2 голосов
/ 16 июля 2015

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

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

1 голос
/ 23 сентября 2018

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

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

Соответствующее руководство по этому поводу:

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

1 голос
/ 15 апреля 2018

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

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

0 голосов
/ 26 декабря 2014

format: assert Expression [, arguments] Когда assert встречает оператор, Python оценивает выражение. Если оператор неверен, возникает исключение (assertionError).Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError.Исключения AssertionError могут быть перехвачены и обработаны, как и любое другое исключение, с помощью оператора try-кроме, но если не обработано, они завершат программу и произведут трассировку.Пример:

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!    
0 голосов
/ 26 июля 2017

По сути, ключевое слово assert означает, что если условие не является истинным, то оно выполняется через ошибку подтверждения, иначе оно продолжается, например, в 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
0 голосов
/ 25 апреля 2017
>>>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
>>> 
0 голосов
/ 20 апреля 2019

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

Значение 1:

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

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

* sys.flags.optimize установлено в 1 (True);

* и, __debug__ установлен на False;

Значение 2: отключает еще одну вещь

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

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

0 голосов
/ 24 марта 2015
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

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

...