Python斷言

Python assert 語句,又稱斷言語句,可以看做是功能縮小版的 if 語句,它用於判斷某個表示式的值,如果值為真,則程式可以繼續往下執行;反之,Python 直譯器會報 AssertionError 錯誤。
assert 語句的語法結構為:

assert 表示式

assert 語句的執行流程可以用 if 判斷語句表示(等效),如下所示:

if 表示式==True:
程式繼續執行
else:
程式報 AssertionError 錯誤

明明 assert 會令程式崩潰,為什麼還要使用它呢?這是因為,與其讓程式在晚些時候崩潰,不如在錯誤條件出現時,就直接讓程式崩潰,這有利於我們對程式排錯,提高程式的健壯性。
因此,assert 語句通常用於檢查使用者的輸入是否符合規定,還經常用作程式初期測試和除錯過程中的輔助工具。
下面的程式演示了 assert 語句的用法:

mathmark = int(input())
#斷言數學考試分數是否位於正常範圍內
assert 0 <= mathmark <= 100
#只有當 mathmark 位於 [0,100]範圍內,程式才會繼續執行
print("數學考試分數為:",mathmark)

執行該程式,測試資料如下:

90
數學考試分數為: 90

再次執行該程式,測試資料為:

159

Traceback (most recent call last):
File "C:\Users\mengma\Desktop\file.py", line 3, in <module>
assert 0 <= mathmark <= 100
AssertionError

可以看到,當 assert 語句後的表示式值為真時,程式繼續執行;反之,程式停止執行,並報 AssertionError 錯誤。

常用斷言函式

  • 這裡介紹幾個常用斷言的使用方法,可以一定程度上幫助大家對預期結果進行判斷。-

  • assertEqual

  • assertNotEqual

  • assertTrue

  • assertFalse

  • assertIsNone

  • assertIsNotNone

  • assertEqual 和 assertNotEqual

  • assertEqual:如兩個值相等,則pass

  • assertNotEqual:如兩個值不相等,則pass

  • 使用方法:

    assertEqual(first,second,msg)其中firstsecond進行比較,如果相等則通過;msg為失敗時列印的資訊,選填;斷言assertNotEqual反著用就可以了。

  • assertTrue和assertFalse

  • assertTrue:判斷bool值為True,則pass

  • assertFalse:判斷bool值為False,則Pass

  • 使用方法:

    assertTrue(expr,msg)其中express輸入相應表示式,如果表示式為真,則pass;msg選填;斷言assertFalse如果表示式為假,則pass

  • assertIsNone和assertIsNotNone

  • assertIsNone:不存在,則pass

  • assertIsNotNone:存在,則pass

  • 使用方法:

    assertIsNone(obj,msg)檢查某個元素是否存在

  • 總結:

  • 常用

assertEqual(a, b)     a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b 2.7
assertIsNot(a, b) a is not b 2.7
assertIsNone(x) x is None 2.7
assertIsNotNone(x) x is not None 2.7
assertIn(a, b) a in b 2.7
assertNotIn(a, b) a not in b 2.7
assertIsInstance(a, b) isinstance(a, b) 2.7
assertNotIsInstance(a, b) not isinstance(a, b) 2.7
  • 其它
assertAlmostEqual(a, b)     round(a-b, 7) == 0
assertNotAlmostEqual(a, b) round(a-b, 7) != 0
assertGreater(a, b) a > b 2.7
assertGreaterEqual(a, b) a >= b 2.7
assertLess(a, b) a < b 2.7
assertLessEqual(a, b) a <= b 2.7
assertRegexpMatches(s, re) regex.search(s) 2.7
assertNotRegexpMatches(s, re) not regex.search(s) 2.7
assertItemsEqual(a, b) sorted(a) == sorted(b) and works with unhashable objs 2.7
assertDictContainsSubset(a, b) all the key/value pairs in a exist in b 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7
assertDictEqual(a, b) dicts 2.7
assertMultiLineEqual(a, b) strings 2.7
assertSequenceEqual(a, b) sequences 2.7
assertListEqual(a, b) lists 2.7
assertTupleEqual(a, b) tuples 2.7
assertSetEqual(a, b) sets or frozensets 2.7assertDictEqual(a, b) dicts 2.7
  • 使用時機:

那麼我們什麼時候應該使用斷言呢?如果沒有特別的目的,斷言應該用於如下情況:

  • 防禦性的程式設計
  • 執行時對程式邏輯的檢測
  • 合約性檢查(比如前置條件,後置條件)
  • 程式中的常量
  • 檢查文件
  • 例:防禦性程式設計中新增斷言

    在程式碼開始添加註釋是個好的開端,但是人們都不太喜歡讀和更新這些註釋,這些註釋會很快變得過時。但對於斷言,我們可以同時對這塊程式碼編寫文件,如果這些斷言被違反了,會直接引起一個簡單而又直接的失敗。
assert target in(x, y, z)
if target ==x:
run_x_code()
elif target ==y:
run_y_code()
else:
assert target == z
run_z_code()

引用:https://www.cnblogs.com/-wenli/p/13398130.html