Я читал некоторый исходный код и в нескольких местах я видел использование assert
.
Что это значит точно? Каково его использование?
python
assert
assertions
Хоссейн
источник
источник
Ответы:
assert
Утверждение существует практически в каждом языке программирования. Это помогает обнаруживать проблемы в начале вашей программы, где причина ясна, а не позже, как побочный эффект какой-либо другой операции.Когда вы делаете ...
... вы говорите программе проверить это условие и немедленно вызвать ошибку, если условие ложно.
В Python это примерно эквивалентно этому:
Попробуйте это в оболочке Python:
Утверждения могут содержать необязательное сообщение, и вы можете отключить их при запуске интерпретатора.
Чтобы напечатать сообщение, если утверждение не выполнено:
Вы не использовать скобки для вызова
assert
как функции. Это утверждение. Если вы это сделаете,assert(condition, message)
вы будете запускатьassert
с(condition, message)
кортежем в качестве первого параметра.Что касается их отключения, то при работе
python
в оптимизированном режиме, где__debug__
естьFalse
, утверждения assert будут игнорироваться. Просто передайте-O
флаг:Смотрите здесь для соответствующей документации.
источник
if not condition: raise AssertError()
, почему я должен использовать assert? Существуют ли условия, при которых утверждение лучше, чем просто более короткая формаif not condition
заявления?if
). Прочитайте документы для получения дополнительной информации :)assert
, но после прочтения всех ответов я полностью ничего не получил!Остерегайтесь скобок. Как уже было отмечено выше, в Python 3,
assert
по - прежнему является утверждение , поэтому по аналогии сprint(..)
, можно экстраполировать то же самоеassert(..)
или ,raise(..)
но вы не должны.Это важно, потому что:
не будет работать, в отличие от
Причина, по которой первый не будет работать, состоит в том, что он
bool( (False, "Houston we've got a problem") )
оценивается какTrue
.В заявлении
assert(False)
это просто лишние круглые скобкиFalse
, которые оценивают их содержимое. Но сassert(False,)
круглыми скобками теперь есть кортеж, а непустой кортеж оцениваетсяTrue
в логическом контексте.источник
assert (2 + 2 = 5), "Houston we've got a problem"
должно быть хорошо, да?assert (2 + 2 = 5), "Houston we've got a problem"
не сработает ... но это не имеет ничего общего с утверждением assert, что нормально. Ваше состояние не будет работать, потому что это не условие. Пропустить секунду=
.Как отмечалось в других ответах,
assert
это похоже на создание исключения, если данное условие не соответствует действительности. Важным отличием является то, что операторы assert игнорируются, если вы компилируете свой код с опцией оптимизации-O
. Документация говорит , чтоassert expression
может быть лучше описано как эквивалентЭто может быть полезно, если вы хотите тщательно протестировать свой код, а затем выпустить оптимизированную версию, если вы довольны тем, что ни одно из ваших утверждений не завершилось неудачей - когда включена оптимизация,
__debug__
переменная становится ложной, а условия перестают оцениваться. Эта функция также может вас поймать, если вы полагаетесь на утверждения и не понимаете, что они исчезли.источник
if Not Error: raise Exception(“ this is a error”)
? Таким образом, программа все равно покажет источник ошибки, когда пользователь ее запустит ..assert
оператор? Здесь предполагается, что когда программа выпущена для конечного пользователя, вы используете флаг -O, таким образом, предполагая, что все ошибки были удалены. Следовательно, любая ошибка или сбой программы происходят из-за ввода в программу, которая действительна в соответствии с контрактом, но не может быть обработана программой. Так что это должно предупредить пользователя как такового.Цель утверждения в Python - информировать разработчиков о неисправимых ошибках в программе.
Утверждения не предназначены для оповещения об ожидаемых ошибках, например, «файл не найден», где пользователь может предпринять корректирующие действия (или просто повторить попытку).
Другой способ взглянуть на это - сказать, что утверждения - это внутренние самопроверки в вашем коде. Они работают, объявив некоторые условия невозможными в вашем коде. Если эти условия не выполняются, это означает, что в программе есть ошибка.
Если ваша программа не содержит ошибок, эти условия никогда не возникнут. Но если один из них действительно произойдет программа даст сбой с ошибкой утверждение , сообщая вам , какие именно было запущено «невозможно» состояние. Это значительно облегчает поиск и исправление ошибок в ваших программах.
Вот краткое изложение учебника по утверждениям Python, которые я написал:
источник
assert
заявление и когда использовать это. Я пытаюсь понять ряд терминов, которые вы ввели в статье.assert store.product_exists(product_id), 'Unknown product id'
это не очень хорошая практика, потому что если отладка отключена, тоuser
даже если нетadmin
, удастся удалить продукт. Считаете ли вы ,assert user.is_admin()
какunrecoverable
ошибка? Почему это не такself-check
?assert statement
, не может лиprice
также считаться пользовательским вводом? Почему вы рассматриваетеassert user.is_admin()
как проверку данных, а не какassert price
?Другие уже дали вам ссылки на документацию.
Вы можете попробовать следующее в интерактивной оболочке:
Первое утверждение ничего не делает, а второе вызывает исключение. Это первая подсказка: утверждения полезны для проверки условий, которые должны быть истинными в данной позиции вашего кода (обычно начало (предусловия) и конец функции (постусловия)).
Утверждения в действительности тесно связаны с программированием по контракту, что является очень полезной инженерной практикой:
http://en.wikipedia.org/wiki/Design_by_contract .
источник
Из документов:
Здесь вы можете прочитать больше: http://docs.python.org/release/2.5.2/ref/assert.html
источник
Утверждение assert имеет две формы.
Простая форма,
assert <expression>
эквивалентнаРасширенная форма,
assert <expression1>, <expression2>
эквивалентнаисточник
Утверждения - это систематический способ проверки того, что внутреннее состояние программы соответствует ожидаемому программистом с целью выявления ошибок. Смотрите пример ниже.
источник
Вот простой пример, сохраните это в файле (скажем, b.py)
и результат, когда
$python b.py
источник
если оператор после assert равен true, то программа продолжается, но если оператор после assert равен false, программа выдает ошибку. Просто как тот.
например:
источник
assert
Утверждение существует практически в каждом языке программирования. Это помогает обнаруживать проблемы в начале вашей программы, где причина ясна, а не позже, как побочный эффект какой-либо другой операции. Они всегда ожидаютTrue
условия.Когда вы делаете что-то вроде:
Вы говорите программе проверить это условие и немедленно вызвать ошибку, если она ложна.
В Python
assert
выражение эквивалентно:Вы можете использовать расширенное выражение для передачи необязательного сообщения :
Попробуйте это в интерпретаторе Python:
Есть некоторые предостережения видели перед их использованием в основном для тех , кто посчитает переключение между
assert
иif
отчетностью. Цельюassert
является использование в случаях, когда программа проверяет условие и возвращает значение, которое должно немедленно остановить программу, вместо того, чтобы использовать какой-либо альтернативный способ обойти ошибку:1. Скобки
Как вы могли заметить, в этом
assert
утверждении используются два условия. Следовательно, не используйте скобки, чтобы использовать их как очевидный совет. Если вы делаете такие как:Пример:
Вы будете запускать
assert
с,(condition, message)
который представляет кортеж в качестве первого параметра, и это происходит потому, что непустой кортеж в Python всегдаTrue
. Тем не менее, вы можете сделать отдельно без проблем:Пример:
2. Цель отладки
Если вам интересно, когда использовать
assert
заявление. Возьмите пример, используемый в реальной жизни:* Когда ваша программа стремится контролировать каждый параметр, введенный пользователем или что-то еще:
* Другой случай по математике, когда 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
обычно используется программистами в библиотеках или модулях, которые не имеют прямого взаимодействия с пользователем.источник
Как кратко изложено на C2 Wiki :
Вы можете использовать
assert
оператор для документирования вашего понимания кода в конкретной точке программы. Например, вы можете задокументировать предположения или гарантии относительно входных данных (предварительных условий), состояния программы (инвариантов) или выходных данных (постусловий).Если ваше утверждение когда-либо окажется неудачным, это предупреждение для вас (или вашего преемника), что вы неправильно поняли программу, когда вы ее написали, и что она, вероятно, содержит ошибку.
Для получения дополнительной информации у Джона Регера есть замечательное сообщение в блоге об использовании утверждений , которое также применимо к
assert
выражению Python .источник
Если вы хотите точно знать, что зарезервированная функция делает в python, введите
help(enter_keyword)
Убедитесь, что при вводе зарезервированного ключевого слова вы вводите его в виде строки.
источник
Python assert - это, по сути, средство отладки, которое проверяет условия для внутренней самопроверки вашего кода. Assert делает отладку действительно простой, когда ваш код попадает в невозможные крайние случаи. Утверждают, проверяют эти невозможные случаи.
Допустим, есть функция для расчета цены товара после скидки:
Здесь discounts_price никогда не может быть меньше 0 и больше фактической цены. Таким образом, в случае нарушения вышеуказанного условия assert вызывает ошибку утверждения, которая помогает разработчику определить, что произошло нечто невозможное.
Надеюсь, поможет :)
источник
assert
полезен в контексте отладки, но не следует полагаться вне контекста отладки.Мое краткое объяснение:
assert
Возникает,AssertionError
если выражение ложно, в противном случае просто продолжает код, и если есть запятая, какой бы она ни былаAssertionError: whatever after comma
, и код будет выглядеть так:raise AssertionError(whatever after comma)
Связанный учебник об этом:
источник
assert
, но не когда использовать (или не использовать)assert
; также отмечая, чтоassert
можно отключить, если__debug__
этоFalse
было бы полезно.В Pycharm, если вы используете
assert
вместе сisinstance
объявлением типа объекта, он позволит вам получить доступ к методам и атрибутам родительского объекта во время кодирования, он автоматически завершится автоматически.Например, скажем
self.object1.object2
, этоMyClass
объект.источник
Как написано в других ответах,
assert
операторы используются для проверки состояния программы на данный момент.Я не буду повторять то, что было сказано о связанном сообщении, скобках или
-O
опции и__debug__
константе. Проверьте также документ для получения информации из первых рук. Я сосредоточусь на вашем вопросе: какая пользаassert
? Точнее, когда (а когда нет) следует использоватьassert
?Операторы
assert
полезны для отладки программы, но не рекомендуется проверять ввод пользователя. Я использую следующее эмпирическое правило: сохраняйте утверждения, чтобы обнаружить, что это не должно случиться . Пользовательский ввод может быть неправильным, например, пароль слишком короткий, но это не так . Если диаметр круга не в два раза больше его радиуса, то у вас такого не должно быть .Самое интересное, на мой взгляд, использование
assert
вдохновлено программированием по контракту, как описано Б. Мейером в [Создание объектно-ориентированного программного обеспечения] ( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction% 2C_2nd_Edition ) и реализован на [языке программирования Eiffel] ( https://en.wikipedia.org/wiki/Eiffel_(programming_language) ). Вы не можете полностью эмулировать программирование по контракту, используяassert
оператор, но интересно сохранить намерение.Вот пример. Представьте, что вам нужно написать
head
функцию (например, [head
функция в Haskell] ( http://www.zvon.org/other/haskell/Outputprelude/head_f.html )). Вам дана следующая спецификация: «если список не пустой, вернуть первый элемент списка». Посмотрите на следующие реализации:А также
(Да, это можно записать как
return xs[0] if xs else None
, но это не главное) .Если список не пустой, обе функции имеют одинаковый результат, и этот результат является правильным:
Следовательно, обе реализации являются (я надеюсь) правильными. Они отличаются, когда вы пытаетесь взять заголовок пустого списка:
Но:
Опять же, обе реализации верны, потому что никто не должен передавать пустой список этим функциям (мы не в спецификации ). Это неправильный вызов, но если вы сделаете такой вызов, все может произойти. Одна функция вызывает исключение, другая возвращает специальное значение. Самое главное: мы не можем полагаться на это поведение . Если
xs
пусто, это будет работать:Но это приведет к сбою программы:
Чтобы избежать неожиданностей, я хотел бы знать, когда я передаю какой-то неожиданный аргумент в функцию. Другими словами: я хотел бы знать, когда наблюдаемое поведение ненадежно, потому что оно зависит от реализации, а не от спецификации. Конечно, я могу прочитать спецификацию, но программисты не всегда внимательно читают документы.
Представьте, если бы у меня был способ вставить спецификацию в код, чтобы получить следующий эффект: когда я нарушаю спецификацию, например, передавая пустой список
head
, я получаю предупреждение. Это было бы очень полезно для написания правильной (то есть соответствующей спецификации) программы. И вот гдеassert
на сцене появляется:А также
Теперь у нас есть:
А также:
Обратите внимание, что
head1
бросаетAssertionError
, а неIndexError
. Это важно, потому что этоAssertionError
не какая-либо ошибка во время выполнения: она сигнализирует о нарушении спецификации. Я хотел предупреждение, но я получаю ошибку. К счастью, я могу отключить проверку (используя-O
опцию), но на свой страх и риск. Я сделаю это, крушение действительно дорого, и надеюсь на лучшее. Представьте, что моя программа встроена в космический корабль, который путешествует через черную дыру. Я отключу утверждения и надеюсь, что программа достаточно надежна, чтобы не зависать как можно дольше.Этот пример касался только предварительных условий, которые можно использовать
assert
для проверки постусловий (возвращаемое значение и / или состояние) и инвариантов (состояние класса). Обратите внимание, что проверка постусловий и инвариантов с помощьюassert
может быть громоздкой:У вас не будет чего-то более сложного, чем у Eiffel, но вы можете улучшить общее качество программы.
Подводя итог,
assert
можно сказать , что это удобный способ обнаружения ситуации, которая не должна возникать . Нарушения спецификации (например, передача пустого спискаhead
) являются первоклассными, это не должно происходить в ситуациях. Следовательно, хотяassert
оператор может использоваться для обнаружения любой непредвиденной ситуации, это привилегированный способ обеспечить выполнение спецификации. После того, как вы вставилиassert
операторы в код для представления спецификации, мы можем надеяться, что вы улучшили качество программы, потому что будут сообщаться неверные аргументы, неправильные возвращаемые значения, неправильные состояния класса ....источник
format: assert Expression [, arguments] Когда assert встречает оператор, Python оценивает выражение. Если оператор не равен true, возникает исключение (assertionError). Если утверждение не выполняется, Python использует ArgumentExpression в качестве аргумента для AssertionError. Исключения AssertionError могут быть перехвачены и обработаны, как и любое другое исключение, с помощью оператора try-exception, но если не обработано, они завершат программу и произведут трассировку. Пример:
Когда приведенный выше код выполняется, он дает следующий результат:
источник
Может использоваться для обеспечения передачи параметров в вызове функции.
источник
if not user_key: raise ValueError()
последних двух абзацев здесь: wiki.python.org/moin/UsingAssertionsEffectivelyassert
Не следует использовать для проверки входных данных , поскольку либо проверки будут удалены, если__debug__
естьFalse
. Кроме того, использование утверждений в целях, не связанных с отладкой, может привести к томуAssertionError
, что люди поймут получающиеся s, что может сделать отладку более сложной, а не меньшей.источник
По сути, ключевое слово assert означает, что если условие не истинно, то оно через ошибку assertionerror, иначе оно продолжается, например, в python.
код-1
ВЫВОД:
код-2
ВЫВОД:
источник
assert
, но не отвечает, когда использовать (или не использовать)assert
.