У чому полягає використання „assrt” в Python?


Відповіді:


1082

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

Твердження можуть включати необов'язкове повідомлення, і ви можете їх відключити під час роботи перекладача.

Щоб надрукувати повідомлення, якщо твердження не вдалося:

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

Ви НЕ використовувати дужки для виклику assertяк функції. Це твердження. Якщо ви assert(condition, message)все-таки будете виконувати функцію assertз (condition, message)кортежем як перший параметр.

Що стосується їх відключення, то при запуску pythonв оптимізованому режимі, де __debug__є False, заяви твердження будуть ігноруватися. Просто передайте -Oпрапор:

python -O script.py

Дивіться тут відповідну документацію.


92
Nit: assert - це твердження, а не функція. І на відміну від друку , в Python 3 це все-таки твердження .
Боб Штейн

2
@Chaine assert означає "переконайтеся, що * щось" є "Істинним". Отже, твердження a == 3 переконається, що a дорівнює 3; якщо a не дорівнює 3 (тобто a == 3 - False), то це буде підняти помилку
Ant Ant

5
Якщо я можу просто скористатись if not condition: raise AssertError(), чому я маю використовувати ствердження? Чи існують умови, за яких аргумент кращий, ніж просто коротша форма if not conditionвисловлювання?
alpha_989

6
@ alpha_989 a) це коротше і легше для читання; б) ви можете відключити заяви твердження під час запуску інтерпретатора (не так у посібнику if). Прочитайте документи для отримання додаткової інформації :)
slezica

9
абсолютно не можу отримати, як ця відповідь набирає стільки голосів, насправді також відповідають інші. питання "У чому полягає використання" assert "в Python?", тому задається питанням: коли використовувати, а точніше: який сценарій використання assert, але прочитавши всі відповіді, я абсолютно нічого не хочу!
lnshi

422

Слідкуйте за дужками. Як уже було відзначено вище, в 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в булевому контексті.


18
Я прийшов сюди шукати цю точну інформацію про парони та наступне повідомлення. Дякую.
superbeck

6
Але assert (2 + 2 = 5), "Houston we've got a problem"має бути гаразд, так?
SherylHohman

4
@SherylHohman ви також можете спробувати запустити це самостійно і побачити, чи працює він чи ні
DarkCygnus

2
Не забувайте, що люди часто використовують дужки для продовження неявного рядка, сумісного з PEP 8. Також не забувайте, що кортежі визначаються не круглими дужками, а наявністю коми (кортежі не мають нічого спільного з паронами, за винятком цілей пріоритет оператора).
коуберт

4
assert (2 + 2 = 5), "Houston we've got a problem"не буде працювати ... але це не має нічого спільного з твердженням про ствердження, що добре. Ваш стан не працюватиме, оскільки це не умова. Пропустив секунду =.
n1k31t4

133

Як відзначали інші відповіді, assertподібне до викидання винятку, якщо задана умова не відповідає дійсності. Важлива відмінність полягає в тому, що твердження про ствердження ігноруються, якщо ви компілюєте код з опцією оптимізації -O. Документація каже , що assert expressionможе бути краще описано як еквівалент

if __debug__:
   if not expression: raise AssertionError

Це може бути корисно, якщо ви хочете ретельно протестувати свій код, а потім випустіть оптимізовану версію, коли ви щасливі, що жоден із ваших випадків твердження не виходить - коли оптимізація ввімкнена, __debug__змінна стає помилковою і умови перестануть оцінюватися. Ця функція також може вас застати, якщо ви покладаєтесь на твердження і не розумієте, що вони зникли.


Чи означає це, що якщо певна змінна або правильна інформація (відповідно до договору, за якою написана програма) може призвести до збоїв програми, коли її запускає користувач (якщо припустити, що прапор -O використовується, коли користувач виконує програму), замість цього слід використовувати if Not Error: raise Exception(“ this is a error”)? Таким чином, програма все одно покаже джерело помилки, коли користувач її запустить ..
alpha_989

З іншого боку, якщо ви очікуєте, що програма може помилитися через неправильну логіку / реалізацію коду (але не через вхід, який відповідає договору користувачеві програми), ви повинні використовувати assertзаяву? Припущення тут полягає в тому, що коли програма випускається кінцевому користувачеві, ви використовуєте прапор -O, при цьому припускаючи, що всі помилки були видалені. Отже, будь-яка помилка або збій програми відбувається через вхід до програми, що діє згідно з договором, але не може бути оброблена програмою. Тому він повинен насторожити користувача як такого.
alpha_989

@ alpha_989 це точно так. Мені подобається думати про твердження як про перевірку добросовісності, які допомагають тобі як розробнику переконатися, що те, що ти вважаєш правдивим, насправді є правдивим під час розвитку.
Крістофер Шроба

52

Метою твердження в Python є інформування розробників про неповернення помилки в програмі.

Твердження не призначені для сигналізації очікуваних умов помилки, наприклад, "файл не знайдено", коли користувач може вжити коригувальних дій (або просто спробувати ще раз).

Ще один спосіб поглянути на це - сказати, що твердження - це внутрішня самоперевірка вашого коду. Вони працюють, оголошуючи деякі умови неможливими у вашому коді. Якщо ці умови не виконуються, це означає, що в програмі є помилка.

Якщо у вашій програмі немає помилок, ці умови ніколи не виникнуть. Але якщо один з них дійсно станеться програма дасть збій з помилкою твердження , повідомляючи вам , які саме було запущено «неможливо» стан. Це значно простіше відстежувати та виправляти помилки у ваших програмах.

Ось підсумок із підручника про твердження Python, які я написав:

Заява твердження Python - це допомога налагодження, а не механізм обробки помилок під час виконання. Мета використання тверджень - дозволити розробникам швидше знайти ймовірну причину помилки. Помилка твердження ніколи не повинна виникати, якщо у вашій програмі є помилка.


Дякуємо за статтю. Дуже корисно зрозуміти assertтвердження і коли це використовувати. Я намагаюся зрозуміти ряд термінів, які ви ввели у статті.
alpha_989

Я думав, що опублікую коментарі тут, щоб набагато більше людей могли отримати користь від уточнень. Вибачте, якщо питання занадто наївні.
alpha_989

У своєму блозі, який ви пов’язали, ви наводите приклад, коли ви згадали, що `assrt 0 <= price <= product ['price']` є правильним, але використовуючи `assert user.is_admin (), 'Потрібно мати права адміністратора для видалення '' і assert store.product_exists(product_id), 'Unknown product id'не є хорошою практикою, тому що якщо налагодження вимкнено, то userнавіть якщо не єadmin продукт, , зможе видалити продукт. Чи вважаєте ви , assert user.is_admin()як unrecoverableпомилка? Чому це не є self-check?
alpha_989

Якщо ви вважаєте, що "user.is_admin ()" є введенням користувача, і тому його не слід використовувати в assert statement, чи не може priceтакож вважатися введенням користувача? Чому ви вважаєте assert user.is_admin()перевірку даних, але ні assert price?
alpha_989

1
@LaryxDecidua Nope, ви можете просто прочитати його на моєму веб-сайті, підручник є загальнодоступним. Просто натисніть на втечу або натисніть на символ "х", якщо вас не цікавить інформаційний бюлетень. Сподіваюсь, це допомагає :-)
dbader

51

Інші вже давали вам посилання на документацію.

Ви можете спробувати наступне в інтерактивній оболонці:

>>> 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 .


Так це означає, що ми можемо перевірити код у такій ситуації, як assrt (2> 5) та підвищити помилку ще?

20
Втратити парони, стверджувати, що це не функція.
пігулка

2
Втрата паронів важливіша, ніж здається. Дивіться нижче .
Євгеній Сергєєв

6
Ассарт насправді датується (задовго до «контрактів») Тьюрінгу, коли він написав одну з найдавніших робіт про те, як програмісти можуть вирішити досить грізну задачу створення правильних програм. Виявлення того, що папір залишається читачем як вправа, оскільки всі програмісти можуть отримати користь від ознайомлення з його роботою. :-) turingarchive.org
Рон Берк

17

З документів:

Assert statements are a convenient way to insert debugging assertions into a program

Тут ви можете прочитати більше: http://docs.python.org/release/2.5.2/ref/assert.html


Мені подобається цей коментар, оскільки він просто пояснює, що це дуже просто. моє запитання: "Якщо я написав належний одиничний тест, навіщо мені потрібно твердження"? цей матеріал все одно не працює у виробництві.
dtc

17

Заява твердження має дві форми.

Проста форма, assert <expression>еквівалентна

if __debug__:
    if not <expression>: raise AssertionError

Розширена форма, assert <expression1>, <expression2>еквівалентна

if __debug__:
    if not <expression1>: raise AssertionError, <expression2>

16

Твердження - це систематичний спосіб перевірити, чи внутрішній стан програми такий, як очікував програміст, з метою виявлення помилок. Дивіться приклад нижче.

>>> 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!
>>> 

1
Крім того, твердження часто можуть використовуватися в одиничних програмах тестування. stackoverflow.com/questions/1383/what-is-unit-testing
panofish

7

Ось простий приклад: збережіть це у файлі (скажімо, 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

6

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

наприклад:

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError

4

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)символом a, який представляє кортеж як перший параметр, і це трапляється, тому що не порожній кортеж у 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або -OOпрапором - значення значення 1, 2 та 0 (за замовчуванням) відповідно - або PYTHONOPTIMIZEзмінна середовище .

Значення 1:

* твердження вимкнено;

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

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

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

Значення 2: вимикає ще один матеріал

* Документи вимкнено;

Тому використання assertоператора для перевірки свого роду очікуваних даних є надзвичайно небезпечним, маючи на увазі навіть деякі проблеми безпеки. Тоді, якщо вам потрібно підтвердити якийсь дозвіл, я рекомендую вас raise AuthErrorзамість цього. Як попередньо ефективний ефект, програмування assertзазвичай використовують програмісти в бібліотеках або модулях, у яких користувач не взаємодіє безпосередньо.


3

Як коротко узагальнено у Вікі С2 :

Затвердження - булевий вираз у певній точці програми, що буде істинним, якщо не буде помилки в програмі.

Ви можете використовувати assertоператор, щоб документувати своє розуміння коду в певному програмному пункті. Наприклад, ви можете задокументувати припущення або гарантії щодо входів (передумов), стану програми (інваріанти) або виходів (постумов).

Якщо ваше твердження коли-небудь не вдасться, це попередження для вас (або вашого наступника) про те, що ваше розуміння програми було неправильним, коли ви її написали, і що вона, ймовірно, містить помилку.

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


2

Якщо ви хочете дізнатися, що саме робить зарезервована функція в python, введіть help(enter_keyword)

Переконайтесь, що ви вводите зарезервоване ключове слово, вводите його як рядок.


2

Python assert - це в основному налагоджувальний засіб, який перевіряє умову для внутрішньої самоперевірки вашого коду. Assert робить налагодження дійсно простим, коли ваш код потрапляє у неможливі крайові випадки. Затвердити перевірку цих неможливих випадків.

Скажімо, існує функція розрахунку ціни товару після знижки:

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

тут, знижена_ціна ніколи не може бути меншою від 0 і більшою від фактичної ціни. Так, у випадку порушення вищезазначеної умови ствердження викликає помилку твердження, яка допомагає розробнику визначити, що сталося щось неможливе.

Сподіваюся, це допомагає :)


2
assertє корисним у контексті налагодження, але не слід покладатися поза контекстом налагодження.
FluxIX

2

Моє коротке пояснення:

  • assertпідвищує, AssertionErrorякщо вираз хибний, інакше просто продовжує код, і якщо є кома, якою б вона не була AssertionError: whatever after comma, і кодувати так:raise AssertionError(whatever after comma)

Про це пов'язаний підручник:

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


Відповідь визначає, як користуватися assert, але не коли використовувати (чи не використовувати) assert; також зазначивши, що assertможна відключити, якщо __debug__це Falseбуде корисно.
FluxIX

1

У Pycharm, якщо ви використовуєте assertразом з isinstanceдля оголошення типу об'єкта, він дозволить вам отримати доступ до методів та атрибутів батьківського об'єкта під час кодування, він автоматично завершиться автоматично.

Наприклад, скажімо self.object1.object2, це MyClassоб’єкт.

import MyClasss

def code_it(self):
    testObject = self.object1.object2 # at this point, program doesn't know that testObject  is a MyClass object yet
    assert isinstance(testObject , MyClasss) # now the program knows testObject is a MyClass object
    testObject.do_it() # from this point on, PyCharm will be able to auto-complete when you are working on testObject

0

Як написано в інших відповідях, assertвисловлювання використовуються для перевірки стану програми в заданій точці.

Я не повторюю те, що було сказано про пов’язане повідомлення, круглі дужки або -Oпараметр і __debug__константа. Перевірте також документ про першу руку інформації. Я зупинюсь на вашому питанні: в чому користь assert? Точніше, коли (і коли ні) слід користуватися assert?

Ці assertзаяви можуть бути використані для налагодження програми, але НЕ рекомендуються для перевірки користувальницького введення. Я використовую таке правило: зберігайте твердження, щоб виявити це не повинно відбуватися . Користувацьке введення користувача може бути невірним, наприклад, пароль занадто короткий, але це не так, це не має відбуватися . Якщо діаметр кола не вдвічі більший за його радіус, ви знаходитесь у такому випадку.

Найбільш цікаве, на мій погляд, використання assertнатхнене програмуванням за контрактом, як описано Б. Мейєром у [Об'єктно-орієнтована побудова програмного забезпечення] ( https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction% 2C_2nd_Edition ) та впроваджено в [Ейфелева мова програмування] ( https://en.wikipedia.org/wiki/Eiffel_(programming_language) ). Ви не можете повністю імітувати програмування за контрактом, використовуючи assertвиписку, але цікаво зберегти наміри.

Ось приклад. Уявіть, що ви повинні написати headфункцію (наприклад, [ headфункція в Haskell] ( http://www.zvon.org/other/haskell/Outputprelude/head_f.html )). Дана вами специфікація така: "якщо список не порожній, поверніть перший елемент списку". Подивіться на такі реалізації:

>>> def head1(xs): return xs[0]

І

>>> def head2(xs):
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

(Так, це можна записати як return xs[0] if xs else None, але це не суть) .

Якщо список не порожній, обидві функції мають однаковий результат, і цей результат правильний:

>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True

Отже, обидві реалізації є (сподіваюся) правильними. Вони відрізняються, коли ви намагаєтеся взяти головний пункт порожнього списку:

>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range

Але:

>>> head2([]) is None
True

Знову ж таки, обидві реалізації правильні, тому що ніхто не повинен передавати порожній список цим функціям (у нас немає специфікації ). Це неправильний дзвінок, але якщо ви робите такий дзвінок, може статися все, що завгодно. Одна функція підвищує виняток, інша повертає особливе значення. Найголовніше: ми не можемо розраховувати на таку поведінку . Якщо xsпорожній, це буде працювати:

print(head2(xs))

Але це призведе до краху програми:

print(head1(xs))

Щоб уникнути якихось сюрпризів, хотілося б знати, коли я передаю якийсь несподіваний аргумент функції. Іншими словами: я хотів би знати, коли спостерігається поведінка не є надійною, оскільки це залежить від реалізації, а не від специфікації. Звичайно, я можу прочитати специфікацію, але програмісти не завжди уважно читають документи.

Уявіть, якби у мене був спосіб вставити специфікацію в код, щоб отримати такий ефект: коли я порушую специфікацію, наприклад, передаючи порожній список head, я отримую попередження. Це було б чудово допомогти написати правильну (тобто відповідну специфікації) програму. І ось де assert виходить на сцену:

>>> def head1(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     return xs[0]

І

>>> def head2(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

Тепер ми маємо:

>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

І:

>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

Зауважте, що head1кидає an AssertionError, а не an IndexError. Це важливо, оскільки ан AssertionError- це не будь-яка помилка виконання: вона сигналізує про порушення специфікації. Я хотів попередження, але отримую помилку. На щастя, я можу відключити перевірку (використовуючи -Oопцію), але на свій страх і ризик. Я зроблю це крахом дійсно дорого, і сподіваюся на краще. Уявіть, що моя програма вбудована в космічний корабель, який подорожує чорною дірою. Я відключу твердження і сподіваюся, що програма є достатньо надійною, щоб не виходити з ладу якомога довше.

Цей приклад стосувався лише передумов, якщо ви можете використовувати assertдля перевірки постумов (повернене значення та / або стан) та інваріантів (стан класу). Зауважте, що перевірка постконвенцій та інваріантів за допомогою assertможе бути громіздкою:

  • для постумов потрібно призначити повернене значення змінній і, можливо, зберігати iniial стан об'єкта, якщо ви маєте справу з методом;
  • для інваріантів, ви повинні перевірити стан до і після виклику методу.

У вас не буде щось настільки витончене, як Ейфелева, але ви все ж можете покращити загальну якість програми.


Підводячи підсумок, assertтвердження є зручним способом виявлення такої ситуації, яка не повинна відбуватися . Порушення специфікації (наприклад, передача порожнього списку head) є першим класом, цього не повинно відбуватися . Отже, хоча assertзаява може використовуватися для виявлення будь-якої несподіваної ситуації, це привілейований спосіб забезпечити виконання специфікації. Після того, як ви вставили assertв код заяви для представлення специфікації, ми можемо сподіватися, що ви покращили якість програми, оскільки повідомляться про неправильні аргументи, неправильні значення повернення, неправильні стани класу ...


-2

формат: assert Вираз [, аргументи] Коли assert стикається з твердженням, Python оцінює вираз. Якщо твердження не відповідає дійсності, виникає виняток (assertionError). Якщо твердження не вдалося, Python використовує ArgumentExpression як аргумент для AssertionError. Винятки AssertionError можна виловлювати та обробляти, як і будь-який інший виняток, використовуючи оператор try-osim, але якщо їх не обробляти, вони припиняють програму і видають прослідкування. Приклад:

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!    

-2
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

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


1
Це спрацює, але, наскільки я розумію, твердження не повинні використовуватися для перевірки введення користувачем, оскільки вони можуть бути вимкнені під час виконання. Якщо ви дійсно хочете застосувати або підтвердити введення користувача, скористайтеся if not user_key: raise ValueError()пунктом Перевірити останні 2 пункти тут: wiki.python.org/moin/UsingAssertionsEffectively
alpha_989

assertне слід використовувати для перевірки введення, тому що або перевірка буде знята, якщо __debug__є False. Також використання тверджень для невиправних цілей може призвести до того AssertionError, що люди зможуть наздогнати результат , що може ускладнити налагодження замість менше.
FluxIX

-4
>>>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
>>> 

-4

В основному сенс ключового слова 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

2
будь ласка, форматуйте свій код належним чином. також, як це покращується на попередніх відповідях?
c2huc2hu

чи є якась проблема в моєму поясненні?
ujjwal_bansal

ваше пояснення не додає нічого до існуючих відповідей, а погана граматика ускладнює читання. якщо ви шукаєте запитання для відповіді, перегляньте подачу нових запитань.
c2huc2hu

Надана відповідь відповідає на те, як користуватися assert, але не відповідає, коли використовувати (чи не використовувати) assert.
FluxIX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.