斷言是作為一種除錯工具被發明出來的,用來檢查那些「**寫對了就肯定成立」的條件。例如我們要斷言乙個變數a必須要大於2,就可以這樣寫:
assert a > 2
複製**
當條件不滿足時,就會丟擲assertionerror異常,等同於如下**:
if
not assert_condition:
raise assertionerror
複製**
由於斷言是乙個debug工具,python的實現也符合這個設計哲學,在python中assert語句的執行是依賴於__debug__
變數的,當__debug__
為true時,assert語句才會被執行。
if __debug__ and
not assert_condition:
raise assertionerror
複製**
預設情況下,當我們執行乙個python檔案時,__debug__
是會被設定為true的,只有加引數-o或-oo時,__debug__
才會被設定為false。
新建乙個assert.py檔案,寫下如下**:
print(__debug__)
assert
2 > 5
複製**
當使用python assert.py執行時,__debug__
會輸出true,assert 2 > 5語句會丟擲assertionerror異常。
當使用python -o assert.py執行時,__debug__
會輸出false,assert 2 > 5語句由於沒有執行不會報任何異常。
我們思考這幾個問題:斷言應該用在哪些情境下?異常和斷言的區別是什麼?
用一句話來概括斷言的使用場景和與異常的區別:
檢查先驗條件使用斷言,檢查後驗條件使用異常我們定義乙個read_file函式:
def
read_file
(file_path):
pass
複製**
read_file函式要求在開始執行的時候滿足一定條件:file_path必須是str型別,這個條件就是先驗條件,如果不滿足,就不能呼叫這個函式,如果真的出現了不滿足條件的情況,證明****現了bug,這時候我們就可以使用assert語句來對file_path的型別進行推斷,提醒程式設計師修改**,這樣的推斷在生產環境中是不需要的,也可以使用if + raise語句來實現assert,但是要繁瑣很多。
def
read_file
(file_path):
assert is_instance(file_path, str)
複製**
read_file函式在被呼叫執行後,依然需要滿足一定條件,比如file_path所指定的檔案需要是存在的,並且當前使用者有許可權讀取該檔案,這些條件稱為後驗條件,對於後驗條件的檢查,我們需要使用異常來處理。
def
read_file
(file_path):
assert is_instance(file_path, str)
ifnot check_exist(file_path):
raise notfounderror()
ifnot has_privilege(file_path):
raise permissionerror()
複製**
檔案不存在和沒有許可權,這兩種情況並不屬於**bug,是**邏輯的一部分,上層**捕獲異常後可能會執行其他邏輯,因此我們不能接受這部分**在生產環境中被忽略。並且,相比於assert語句只能丟擲assertionerror,使用異常可以丟擲更細緻的錯誤,方便上層**針對不同錯誤執行不同的邏輯。 你真的會暴力嗎
problem 你真的會暴力嗎 description 給你乙個長度為n的數列,問你這個數列是不是乙個完美數列。乙個數列是完美數列當且僅當不存在兩個不相交的子串行,元素的數值和相同。input 第一行乙個整數t t 50 表示一共有t組。每組第一行乙個整數n n 1e4 表示數列的長度為n,接下來一...
if else 你真的會嗎?
目錄 為什麼我們寫的 都是if else?if else 太多有什麼缺點?是否有好的方法優化?如何重構?異常邏輯處理型重構方法例項一 異常邏輯處理型重構方法例項二 異常邏輯處理型重構方法例項三 異常邏輯處理型重構方法例項四 狀態處理型重構方法例項一 狀態處理型重構方法例項二 總結 盡可能地維持正常流...
你真的會溝通嗎? 下部
溝通是人與人之間 人與群體之間傳遞 反饋思想與情感的過程,溝通的目的是讓對方理解或認可你所表達的資訊,從而產生共鳴,達成一致。成功的溝通可以達到雙贏,不成功的溝通將會帶來歧義與誤解。筆者作為職場人在 你真的會溝通嗎 上部 中與大家分享了內部溝通存在的問題及方法,今天在這裡繼續與大家分享一些關於外部溝...