python中的斷言是一種調試工具,用來測試某一個斷言條件。如果斷言條件為真,則程序將繼續正常執行,但是如果條件為假,那么就會引發AssertionError異常並且顯示相關的錯誤信息。
使用斷言來自動檢測程序中的錯誤,讓程序更可靠以及更易於調試。
斷言舉例
下面假設要用python構建在線商店,為了添加打折優惠券的功能,編寫了下面這個apply_discount函數:
里面中的assert語句就是確保在任何情況下,通過該函數計算的折后價不低於0,也不會高於產品原價。
1 def apply_discount(product, discount): 2 price = int(product['price'] * (1.0 - discount)) 3 assert 0 <= price <= product['price'] 4 return price
shoes = {'name': 'Fancy Shoes', 'price': 14900} price = apply_discount(shoes, 0.25) print(price)
11175
上面的例子正常運行,可以計算出打折后的價格,如果discount=2時,會出現什么結果呢?
shoes = {'name': 'Fancy Shoes', 'price': 14900} price = apply_discount(shoes, 2) print(price)
輸出結果如下:
1 Traceback (most recent call last): 2 File "C:/Desktop/test/main.py", line 9, in <module> 3 price = apply_discount(shoes, 2) 4 File "C:/Desktop/test/main.py", line 3, in apply_discount 5 assert 0 <= price <= product['price'] 6 AssertionError
可以看到觸發了AssertionError.因為此時違反了函數中設置的斷言條件
斷言可以極大的加快調試工作的速度,並且從長遠看來,程序也更加容易維護。
Python的斷言語法
python的斷言語法如下:
1 assert_stmt ::= "assert" expression1 ["," expression2]
其中,expression1是需要測試的條件,可選的expression2是錯誤消息,如果斷言失敗那么就顯示該消息。在執行的時候,python解釋器將每條斷言語句大致轉換成以下這些語句:
1 if __debug__: 2 if not expression1: 3 raise AssertionError(expression2)
這段代碼有下面兩個特征:
- 代碼在檢查斷言條件之前,還會檢查__debug__全局變量。這是一個內置的布爾標記,在一般情況下為真,若進行代碼優化則為假。
- 還可以用expression2傳遞一個可選的錯誤消息,該消息將與回溯中的AssertionError一起顯示,用來進一步簡化調試。
斷言總結:
Python斷言語句是一種測試某個條件的調試輔助功能,可以作為程序的內部自檢。
斷言應該只用於幫助開發人員識別bug,不是用於處理運行時錯誤的機制。
設置解釋器可以全局禁用斷言。