Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python

Ѐункция assert Π² Python

Π’ этом руководствС ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌ словС assert Π² python. Он ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своСм ΠΊΠΎΠ΄Π΅ инструкции assert.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° базовая структура:

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ assert для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания ошибки ΠΊΠΎΠ΄Π°.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ способ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ assert:

Π£Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Assert

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ assert Π² Python ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ условиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ true. Если условиС true, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² порядкС, Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ исправно, ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹. Но Ссли условиС false (это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² нашСм ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ ошибка), Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ частноС ΠΎΡ‚ Π΄Π²ΡƒΡ… чисСл

ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ частноС ΠΎΡ‚ Π΄Π²ΡƒΡ… чисСл. Π’ΠΎΡ‚ ΠΊΠΎΠ΄:

Если ΠΌΡ‹ запустим ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строкС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ assert. Π’ этой строкС провСряСтся, большС Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ num 2 0 ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Если большС нуля, Ρ‚.Π΅. условиС true, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ соотвСтствСнно.

Но ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Division() со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ 0, Ρ‚ΠΎΠ³Π΄Π° условиС assert – false. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ AssertionError, ΠΈ выдаСтся сообщСниС Β«Divisor Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ написали Π² части сообщСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, ΠΌΡ‹ пытаСмся Π½Π°ΠΉΡ‚ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· уравнСния, скаТСм (b2 – 4ac).

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ assert python

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° assert для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ поиска ошибок Π² нашСм ΠΊΠΎΠ΄Π΅ Π½Π° этапС тСстирования. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ тСстировании ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ unitest.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Assert. Π§Ρ‚ΠΎ это?

Assert β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ конструкция, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ прСдполоТСния ΠΎ значСниях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚Π° конструкция ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ мСста обнаруТСния Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Бтранная, Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, конструкция β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² самый нСподходящий ΠΌΠΎΠΌΠ΅Π½Ρ‚. Какой ΠΆΠ΅ Π² Π½Π΅ΠΉ смысл? Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ стали Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ ΠΈ ΠΌΡ‹ Π½Π΅ Β«Π·Π°Π²Π°Π»ΠΈΠ»ΠΈΒ» сразу ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΊΠ°ΠΊ Π½ΠΈ Π² Ρ‡Π΅ΠΌ Π½Π΅ Π±Ρ‹Π²Π°Π»ΠΎ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ Π΄ΠΎΠ»Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ послС этого Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ошибок. А ΠΌΠΎΠΆΠ΅Ρ‚ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Β«Π·Π°Π²Π°Π»ΠΈΡ‚ΡŒΡΡΒ» сама ΠΏΠΎ извСстной Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅ΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅. Или Π½Π°ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΉ винчСстСр ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° с Π³Π΅ΠΉ-порносайтов. Π­Ρ‚ΠΎ называСтся Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (undefined behavior) ΠΈ, Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ расхоТСму мнСнию, ΠΎΠ½ΠΎ свойствСнно Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ языкам программирования с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ доступом ΠΊ памяти (aka C, C++). Π’.ΠΊ. assert Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сразу ΠΆΠ΅ послС обнаруТСния Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ½ позволяСт быстро Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±Π°Π³ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΊ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ Π΅Π³ΠΎ основноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Assert’Ρ‹ доступны Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках программирования, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ java, c#, c ΠΈ python.
КакиС Π²ΠΈΠ΄Ρ‹ assert’ΠΎΠ² Π±Ρ‹Π²Π°ΡŽΡ‚?
Assert’Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° этапС компиляции Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя исполнСния. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° этапС компиляции Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½Ρ‹ β€” Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π½Ρ‹ΠΌΠΈ словами, assert’Ρ‹ Π½Π° этапС компиляции ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΈΡ‡Π΅ΠΌ ΠΈΠ½Ρ‹ΠΌ, ΠΊΠ°ΠΊ синтаксичСским сахаром. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² дальнСйшСм ΠΏΠΎΠ΄ assert’Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ лишь ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ входящиС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСявными. НапримСр, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ нСявно пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса (aka this ΠΈ self). Π’Π°ΠΊΠΆΠ΅ функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π² глобальной области видимости, Π»ΠΈΠ±ΠΎ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ· области видимости лСксичСского замыкания. Π­Ρ‚ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ assert’ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.
Если Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π½Π° этом этапС, Ρ‚ΠΎ ΠΊΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π±Π°Π³ΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Когда ΠΈ Π³Π΄Π΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ assert’Ρ‹?
ΠžΡ‚Π²Π΅Ρ‚ прост β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ assert’Ρ‹ всСгда ΠΈ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΎΠ½ΠΈ Ρ…ΠΎΡ‚ΡŒ Ρ‡ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ. Π’Π΅Π΄ΡŒ ΠΎΠ½ΠΈ сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π³ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅. Π”Π°ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ ΠΈ Π² Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ запросто Π·Π°ΠΊΡ€Π°ΡΡ‚ΡŒΡΡ Π±Π°Π³. НС Π±ΠΎΠΉΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ большоС количСство assert’ΠΎΠ² ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ ΡΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Assert’Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΠΈ нСсут Π²Π°ΠΆΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ прСдполоТСниях, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ расставлСнныС assert’Ρ‹ способны Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² ΠΊΠΎΠ΄Π΅. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ языков программирования ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ assert’ΠΎΠ² Π»ΠΈΠ±ΠΎ Π½Π° этапС компиляции, Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ минимальноС влияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ assert’Ρ‹ ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² Ρ€Π΅Π»ΠΈΠ·-вСрсиях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана Π² Π»ΡƒΡ‡ΡˆΠΈΡ… традициях ООП, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ enterprise ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Ρ‚ΠΎ assert’Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вряд Π»ΠΈ измСнится.

Когда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· assert’ΠΎΠ²?
ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ assert’ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строчку ΠΊΠΎΠ΄Π° Π½Π΅ сильно ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΎΠ²Π° Π±Π°Π³ΠΎΠ². НС сущСствуСт Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ мнСния насчСт ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства assert’ΠΎΠ², Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ насчСт ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ количСство ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Когда я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ·Π½Π°Π» ΠΏΡ€ΠΎ сущСствованиС assert’ΠΎΠ², ΠΌΠΎΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ стали ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ 100500 assert’ΠΎΠ², ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. Π‘ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ количСство assert’ΠΎΠ² Π² ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ стало ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒΡΡ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство assert’ΠΎΠ² Π² ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π±Π΅Π· сущСствСнного ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΡ Π² эффСктивности ΠΎΡ‚Π»ΠΎΠ²Π° Π±Π°Π³ΠΎΠ²:
МоТно ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ входящих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡƒΡ‚Π΅ΠΌ размСщСния ΠΈΡ… лишь Π² функциях, нСпосрСдствСнно Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с Π΄Π°Π½Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Π’.Π΅. Ссли функция foo() Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π° лишь ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bar(), Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ этого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ foo(), Ρ‚.ΠΊ. ΠΎΠ½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bar().
МоТно ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ assert’Ρ‹ Π½Π° нСдопустимыС значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ приводят ΠΊ ΠΊΡ€Π°Ρ…Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² нСпосрСдствСнной близости ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… assert’ΠΎΠ², Ρ‚.Π΅. Ссли ΠΏΠΎ ΠΊΡ€Π°Ρ…Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ быстро ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ мСстонахоТдСниС Π±Π°Π³Π°. К Ρ‚Π°ΠΊΠΈΠΌ assert’Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ указатСля Π½Π° NULL ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ дСлитСля ΠΏΠ΅Ρ€Π΅Π΄ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. Π•Ρ‰Π΅ Ρ€Π°Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡŽΡΡŒ β€” Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ лишь Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° срСда исполнСния Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΡ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π΄Π°Π½Π½Ρ‹Ρ… случаях.
Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство assert’ΠΎΠ² Π±Π΅Π· ΡƒΡ…ΡƒΠ΄ΡˆΠ΅Π½ΠΈΡ эффСктивности ΠΎΡ‚Π»ΠΎΠ²Π° Π±Π°Π³ΠΎΠ². Если Π²Ρ‹ Π² курсС этих способов, Π΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ ΠΈΠΌΠΈ Π² коммСнтариях ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ посту.

Когда нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ assert’Ρ‹?
Π’.ΠΊ. assert’Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ Π½Π° этапС компиляции Π»ΠΈΠ±ΠΎ Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ удалСния assert’Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, Ρ‚ΠΎ это явный ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ использования assert’Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π½ΡƒΡ‚Ρ€ΠΈ assert’Π° нСльзя Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π»ΠΈΠ±ΠΎ внСшнСго окруТСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ assert’Ρ‹:

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π΅Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… assert’Π°Ρ….
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, послС Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ assert’Π°:

Π’.ΠΊ. основноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ assert’ΠΎΠ² β€” ΠΎΡ‚Π»ΠΎΠ² Π±Π°Π³ΠΎΠ² (aka ошибки программирования), Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибками программирования. НапримСр:

Если write() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0, Ρ‚ΠΎ это вовсС Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ Π±Π°Π³. Если assert’Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, Ρ‚ΠΎ ошибка записи ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ, Ρ‡Ρ‚ΠΎ впослСдствиС ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ assert() Ρ‚ΡƒΡ‚ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. Π’ΡƒΡ‚ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ обычная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибки. НапримСр:

Π― ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽ Π½Π° javascript. Π’ Π½Π΅ΠΌ Π½Π΅Ρ‚ assert’ΠΎΠ². Π§Ρ‚ΠΎ ΠΌΠ½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ?
Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках программирования отсутствуСт явная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° assert’ΠΎΠ². ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΎΠ½ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹, слСдуя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Β«ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ проСктирования»:

Π’ΠΎΠΎΠ±Ρ‰Π΅, assert’Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования. Иногда ΠΎΠ½ΠΈ Ρ‚Π°ΠΌ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ expect’Π°ΠΌΠΈ. ΠœΠ΅ΠΆΠ΄Ρƒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ тСстированиСм ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ assert’ΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ β€” ΠΎΠ±Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для быстрого выявлСния ΠΈ исправлСния Π±Π°Π³ΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Но, нСсмотря Π½Π° ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‡Π΅Ρ€Ρ‚Ρ‹, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ тСстированиС ΠΈ assert’Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌΠΈ, Π°, скорСС всСго, Π²Π·Π°ΠΈΠΌΠΎΠ΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΠΈ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. Π“Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ расставлСнныС assert’Ρ‹ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ тСстированиС ΠΊΠΎΠ΄Π°, Ρ‚.ΠΊ. Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ assert’Ρ‹ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ долю всСх ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π² Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Assert Π² Python с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкций assert Π² Python ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ условиС Π½Π° ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² ΠΈΠΌ Ρ„Π°ΠΊΡ‚Ρ‹ (утвСрТдСния) прилоТСния. Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ² тСстированиС прилоТСния. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ дСлСния. Π—Π΄Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ число Π½Π΅ дСлится Π½Π° ноль. ΠŸΡ€ΠΈ тСстировании это указываСтся. НСмного ΠΏΠΎΠ·ΠΆΠ΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Assertion – Ρ‡Ρ‚ΠΎ это Π² Python?

Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ большС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, ΠΈ просто ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π±Π»ΠΎΠΊΡƒ ΠΊΠΎΠ΄Π°. Π’ случаС лоТности этого утвСрТдСния Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ прилоТСния останавливаСтся с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ утвСрТдСния Π² Python ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис.

Π’ΠΎΠ³Π΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π±ΠΎΠ»Π΅Π΅ понятны ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ исполнСнии ΠΊΠΎΠ΄Π°.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅

УтвСрТдСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎ Π΅ΡΡ‚ΡŒ, это дСйствСнный инструмСнт ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ Π΅Π³ΠΎ симуляции.

Как Ρ€Π°Π· инструмСнт ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ останавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² случаС возникновСния ошибки ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ инструкции assert?

Как ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ утвСрТдСния Π² Python? Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ поля Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ пустыми. Π’ ΠΈΠ½ΠΎΠΌ случаС возвращаСтся ошибка Assertion Error.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° прилоТСния:

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² описанном Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΡƒΠΆΠ½ΠΎΠ΅ сообщСниС ΠΏΡ€ΠΈ ошибкС Π½Π΅ возвращаСтся. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ДСлаСтся это ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ инструкции Π±Ρ‹Π»Π° использована Ρ„Ρ€Π°Π·Π° Β« Бписок ranks Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустым».

БоотвСтствСнно, Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

БообщСния ΠΎΠ± ошибкС Π² Assert

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΎΠ±Π΅Ρ‰Π°Π»ΠΈ привСсти Ρ€Π°Π½Π΅Π΅. А ΠΈΠΌΠ΅Π½Π½ΠΎ, Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0.

Π—Π΄Π΅ΡΡŒ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ число 21 дСлится Π½Π° 0. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ 21 Π½Π° 3. Π­Ρ‚ΠΎ Ρƒ Π½Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΈ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7.0.

А послС этого Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ «НСльзя Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° 0Β».

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert написана Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ свСрху строкС. Π—Π΄Π΅ΡΡŒ выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, являСтся Π»ΠΈ вторая пСрСмСнная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠ»Π΅ΠΌ. Если Π½Π΅Ρ‚, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ условиС являСтся истинным. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Ρ‚ Π΄Π°Π»Π΅Π΅.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ assert

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для инструкции assert.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄.

КакиС ошибки самыС частыС Ρƒ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²?

УтвСрТдСния Π² Python – нСслоТная Ρ‚Π΅ΠΌΠ°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ°ΡΠ°ΡŽΡ‚ΡΡ Π΅Π΅:

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Π’ΠΎΠΎΠ±Ρ‰Π΅, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ – это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для сообщСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΎΠ± ошибкС.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования этой конструкции.

К слову, Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ использовали стандартный Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ZeroDivisionError, Π½Π΅ создавая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ утвСрТдСния для этого. Но Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π»ΡŽΠ±Ρ‹Ρ… ошибок одинаковая.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ except Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС ошибки. ΠŸΡ€Π°Π²Π΄Π°, такая Ρ„ΠΎΡ€ΠΌΠ° Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π² Ρ‚ΠΎΠΌ числС, ΠΈ систСмный Π²Ρ‹Ρ…ΠΎΠ΄, ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ assert Π² Python

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ΠΈ:

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, ΠΊΠ°ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² случаС, Ссли ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ условиС оказываСтся Π»ΠΎΠΆΠ½Ρ‹ΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ assert ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ…ΒΆ

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° assert ΒΆ

ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ ваша функция Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если assert ΡƒΠΏΠ°Π΄Π΅Ρ‚, Π²Ρ‹ смоТСтС ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

pytest ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, сравнСния, Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΈ ΡƒΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (см. Python: ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… pytest ). Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС конструкции python Π±Π΅Π· шаблонного ΠΊΠΎΠ΄Π°, Π½Π΅ тСряя ΠΏΡ€ΠΈ этом ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Однако, Ссли Π²Ρ‹ ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π² assert тСкст сообщСния ΠΎΠ± ошибкС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ,

Ρ‚ΠΎ никакая аналитичСская информация Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΈ Π² трСйсбэкС Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ просто ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉΒΆ

А Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ фактичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ соотвСтствуСт строковому ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ TestCase.assertRaisesRegexp Π² unittest ), конСкст-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ match :

Π’ случаС падСния тСста pytest Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π²Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π²Ρ‹Π·Π²Π°Π½ΠΎ (no exception) ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (wrong exception).

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉΒΆ

ИспользованиС контСкстно-зависимых сравнСний¢

pytest Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· контСкстно-зависимой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° сталкиваСтся со сравнСниями. НапримСр, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния этого модуля

Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚:

Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² сравнСния для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаСв:

сравнСниС Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… строк: Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ различия

сравнСниС Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ: Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ индСкс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ нСсоотвСтствия

сравнСниС словарСй: Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ элСмСнты

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ собствСнных сообщСний ΠΊ ΡƒΠΏΠ°Π²ΡˆΠΈΠΌ assert ΒΆ

МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ своС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ объяснСниС, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² Ρ…ΡƒΠΊ (hook) pytest_assertrepr_compare (см. pytest_assertrepr_compare).

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ» conftest.py Ρ…ΡƒΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт нашС сообщСниС для сравниваСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Foo :

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм тСстовый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

Запустив тСстовый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ conftest.py :

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ (assertion introspection)ΒΆ

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· ΡƒΠΏΠ°Π²ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ достигаСтся ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² assert ΠΏΠ΅Ρ€Π΅Π΄ запуском. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ assert ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² сообщСниС ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅. pytest пСрСопрСдСляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ тСстовыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΈΠΌ Π² процСссС сборки (collecting) тСстов, поэтому «assert«-Ρ‹ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… модулях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сами ΠΏΠΎ сСбС Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ тСстами, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚.

МоТно Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСопрСдСлСния assert для ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ модуля, Π²Ρ‹Π·Π²Π°Π² register-assert-rewrite ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ (Π»ΡƒΡ‡ΡˆΠ΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅«conftest.py«).

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π‘Π΅Π½Π΄ΠΆΠ°ΠΌΠΈΠ½Π° ΠŸΠ΅Ρ‚Π΅Ρ€ΡΠΎΠ½Π°: Behind the scenes of pytest’s new assertion rewriting.

ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²ΒΆ

ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пСрСопрСдСлСния assert ΒΆ

На этот случай Π΅ΡΡ‚ΡŒ 2 ΠΎΠΏΡ†ΠΈΠΈ:

ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ модуля, Π΄ΠΎΠ±Π°Π²ΠΈΠ² строку PYTEST_DONT_REWRITE Π² docstring (ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для докумСнтирования модуля).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

# assert Π² Python

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert примСняСтся для автоматичСского об­наруТСния ошибок Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Python. Π­Ρ‚Π° инструкция сдСлаСт ваши ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π°Π΄Π΅ΠΆΠ½Π΅Π΅ ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

По своСй сути инструкция assert прСдставляСт собой срСдство ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ провСряСт условиС. Если условиС утвСрТдСния assert истинно, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит ΠΈ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Β­Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Но Ссли ΠΆΠ΅ вычислСниС условия Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π»ΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ вызываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ AssertionError с Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ сообщСниСм ΠΎΠ± ошибкС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования assert

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ создаСтС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python. Π’Ρ‹ Ρ€Π°Π±ΠΎΒ­Ρ‚Π°Π΅Ρ‚Π΅ Π½Π°Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² систСму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ скидочного ΠΊΡƒΠΏΠΎΠ½Π°, ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ apply_discount() :

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert Π±ΡƒΠ΄Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, нСзависимо ΠΎΡ‚ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π², вычисляСмыС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ сниТСн­ныС Ρ†Π΅Π½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΆΠ΅ 0 ΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΒ­Π½ΠΎΠΉ Ρ†Π΅Π½Ρ‹ Ρ‚ΠΎΠ²Π°Ρ€Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ убСдимся, Ρ‡Ρ‚ΠΎ эта функция Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΒ­ΠΌΠ°Π½ΠΎ, Ссли Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π΅, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ скидку. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹ Π² нашСм ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны Π² Π²ΠΈΠ΄Π΅ простых слова­рСй, для дСмонстрации ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΉ assert :

ИзбСгая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄Π΅Π½Π΅ΠΆΠ½ΠΎΠΉ Ρ†Π΅Π½Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†Π΅Π»ΠΎΠ΅ число для прСдставлСния Ρ†Π΅Π½Ρ‹ Π² ΠΊΠΎΠΏΠ΅ΠΉΠΊΠ°Ρ…. Π˜Ρ‚Π°ΠΊ, Ссли ΠΊ этим туфлям ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ 25 %-Π½ΡƒΡŽ скидку, Ρ‚ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ ΠΏΡ€ΠΈΠ΄Π΅ΠΌ ΠΊ отпускной Ρ†Π΅Π½Π΅ 112,49:

Ѐункция сработала. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΒ­ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСсколько нСдопустимых скидок. НапримСр, 200%-Π½ΡƒΡŽ «скидку», которая Π²Ρ‹Π½ΡƒΠ΄ΠΈΡ‚ нас ΠΎΡ‚Π΄Π°Ρ‚ΡŒ дСньги ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŽ:

Π’ΠΈΠ΄Π½ΠΎ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎΠ± этом ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈ Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ строку исходного ΠΊΠΎΠ΄Π°, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π²Ρ‹Β­Π·Π²Π°Π²ΡˆΠ΅Π΅ сбой ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅. Если Π²ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π²Ρ‹ (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π² вашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅) ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ошибок, Π²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, просто по­смотрСв Π½Π° ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎΠ± ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ трассировкС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

# ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ просто Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ if ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ инструкция assert ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Β­Ρ‰Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΎ нСустранимых ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Ρ… условиях, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ошибка Β«Π€Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Β», Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия ΠΈΠ»ΠΈ просто ΠΏΠΎΠΏΡ€ΠΎΒ­Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π·.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ самопровСрками (internal selfΒ­checks) вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡƒΡ‚Π΅ΠΌ объявлСния Π½Π΅ΠΊΠΈΡ… усло­вий, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π² вашСм исходном ΠΊΠΎΠ΄Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Если ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… условий Π½Π΅ сохраняСтся, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ ошибка.

А ΠΏΠΎΠΊΠ° ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ инструкция assert β€” это срСдство ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Π° Π½Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ЦСль использования инструкции assert состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Β­Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ скорСС Π½Π°ΠΉΡ‚ΠΈ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки. Если Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ошибки Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ AssertionError Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ срСдство языка, всСгда Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ практичС­ски рСализуСтся Π² Python. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π±Π΅Π³Π»ΠΎ взглянСм Π½Π° синтаксис инструкции assert Π² соотвСтствии с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ Python

Π’ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ assert ΠΏΡ€ΠΈΒ­ΠΌΠ΅Ρ€Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π½ΠΈΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ инструкций:

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ интСрСсныС Π΄Π΅Ρ‚Π°Π»ΠΈ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ это уТасно, Π½ΠΎ этот ΠΏΡ€ΠΈΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ допустим ΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· своих ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с ΠΏΠ»Π°Π²Π°Β­ΡŽΡ‰Π΅ΠΉ ошибкой.

# Π›ΠΎΠ²ΡƒΡˆΠΊΠΈ assert

Π•ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… прСдостСрСТСния, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

Π—Π²ΡƒΡ‡ΠΈΡ‚ довольно уТасно (ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈ являСтся), поэтому Π²Π°ΠΌ, вСроятно, слСдуСт ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ эти Π΄Π²Π° прСдостСрСТС­ния хотя Π±Ρ‹ Π±Π΅Π³Π»ΠΎ.

НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ инструкции assert для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…!

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ assert Π² Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ: утвСрТ­дСния assert просто ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚, это ΠΎΠ·Π½Π°Ρ‡Π°Β­Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· условных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ.

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ схоТим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования. Π’ качСствС ΠΏΠΎΠ±ΠΎΡ‡Β­Π½ΠΎΠ³ΠΎ эффСкта ΠΎΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ становится Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ опасно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструкции assert Π² Π²ΠΈΠ΄Π΅ быстрого ΠΈ Π»Π΅Π³ΠΊΠΎΠ³ΠΎ способа ΠΏΡ€ΠΎΒ­Π²Π΅Ρ€ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Поясню: Ссли Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ утвСрТдСния assert ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, содСрТит Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Β«Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅Β» ΠΈΠ»ΠΈ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ быстро ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΡ‚ΠΈΠ² вас ΠΈ привСсти ΠΊ ошибкам ΠΈΠ»ΠΈ Π΄Ρ‹Ρ€Π°ΠΌ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бСзопасности.

Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСмонстрируСт эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. И снова ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ создаСтС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Python с ΠΈΠ½Ρ‚Π΅Ρ€Β­Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠΌ. Π“Π΄Π΅-Ρ‚ΠΎ срСди ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° вашСго прилоТСния Π΅ΡΡ‚ΡŒ функция, которая удаляСт Ρ‚ΠΎΠ²Π°Ρ€ ΠΏΠΎ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ трСхстрочной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΈ ΠΎΠ½ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ использованиСм инструкций assert :

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ администратора инструкциями assert нСсСт Π² сСбС ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. Если утвСрТдСния assert ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Β­Ρ‚ΠΎΡ€Π΅ Python, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ прСвращаСтся Π² Π½ΡƒΠ»Π΅Π²ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Β­Ρ†ΠΈΡŽ. И поэтому Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ выполняСтся. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ²Ρ‹Β­ΡˆΠ°Π΅Ρ‚ΡΡ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с обСспСчСниСм бСзопасности, ΠΈ откроСтся Π΄Π²Π΅Ρ€ΡŒ для Π°Ρ‚Π°ΠΊ, способных Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΠΏΠΎΠ²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² нашСм ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅. ΠžΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…ΠΎ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° has_product() пропускаСтся, ΠΊΠΎΠ³Π΄Π° assert ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ get_product() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ с нСдо­пустимыми ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ ошибкам, β€” Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ написана наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΠΎΠΌ запуска DoS-Π°Ρ‚Π°ΠΊ. НапримСр, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΒ­ΠΏΡ‹Ρ‚ΠΊΠ΅ стороннСго Π»ΠΈΡ†Π° ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ нСизвСстный Ρ‚ΠΎΠ²Π°Ρ€, Ρ‚ΠΎ, скорСС всСго, это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Π·Π»ΠΎΠΌΡ‰ΠΈΠΊ смог Π·Π°Π²Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ нСдопустимыми запросами Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ сбой Π² Ρ€Π°Π±ΠΎΡ‚Π΅ сСрвСра.

Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ? ΠžΡ‚Π²Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ²: Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ утвСрТдСния assert для выполнСния Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ВмСсто этого ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ инструкциями if ΠΈ ΠΏΡ€ΠΈ нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΏΠΎΒ­ΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Когда Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ assert Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° пСрСдаСтся ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, assert всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True ΠΈ ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ выполняСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

НапримСр, это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ сбой:

Π‘ΠΎΠ»Π΅Π΅ свСТиС вСрсии Python 3 для Ρ‚Π°ΠΊΠΈΡ… ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструкций assert ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ синтаксичСскоС ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому всСгда слСдуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ быстрый тСст ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ своих ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстовых случаСв. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ написанию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚.

НСсмотря Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ прСдостСрСТСния, я полагаю, Ρ‡Ρ‚ΠΎ инструкции assert ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ инструмСнтом ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ нС­достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Python.

ПониманиС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ инструкции assert ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³Ρ‡Π΅ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ.

Π­Ρ‚ΠΎ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½Ρ‹ΠΉ Π½Π°Π²Ρ‹ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒ зна­ния Python Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ качСствСнного уровня ΠΈ ΡΡ‚Π°Ρ‚ΡŒ всСсторонним питонистом.Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ бСсконСчныС часы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приходится Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ assert β€” это срСдство ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ провСряСт условиС, Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰Π΅Π΅ Π² качСствС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ самопровСрки вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ assert Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΒ­ΠΌΠΎΠ³Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки. Они Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ assert ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ глобально ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² настройках ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *