導航:首頁 > 編程語言 > pythonassert用法

pythonassert用法

發布時間:2022-07-09 15:39:25

python中的assert是什麼意思呢

>>>a=True
>>>b=False
>>>asserta
>>>assertb
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<mole>
AssertionError
>>>assertaandb
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<mole>
AssertionError
>>>assertaorb

看看上面就可以知道大概的作用了,可以用於測試吧 assert後面期待結果是布爾值True,表達式(a or b)返回的值也為True,所以就不會拋出異常。

⑵ Python中何時使用斷言

這個問題是如何在一些場景下使用斷言表達式,通常會有人誤用它,所以我決定寫一篇文章來說明何時使用斷言,什麼時候不用。

為那些還不清楚它的人,Python的assert是用來檢查一個條件,如果它為真,就不做任何事。如果它為假,則會拋出AssertError並且包含錯誤信息。例如:

py> x = 23
py> assert x > 0, "x is not zero or negative"
py> assert x%2 == 0, "x is not an even number"
Traceback (most recent call last):
File "", line 1, in
AssertionError: x is not an even number

很多人用assert作為一個很快和容易的方法來在參數錯誤的時候拋出異常。但這樣做是錯的,非常錯誤,有兩個原因。首先AssertError不是在測試參數時應該拋出的錯誤。你不應該像這樣寫代碼:

if not isinstance(x, int):
raise AssertionError("not an int")

你應該拋出TypeError的錯誤,assert會拋出錯誤的異常。

但是,更危險的是,有一個關於assert的困擾:它可以被編譯好然後從來不執行,如果你用 –O 或 –oo
選項運行Python,結果不保證assert表達式會運行到。當適當的使用assert時,這是未來,但是當assert不恰當的使用時,它會讓代碼用
-O執行時出錯。

那什麼時候應該使用assert?沒有特定的規則,斷言應該用於:

防禦型的編程
運行時檢查程序邏輯
檢查約定
程序常量
檢查文檔

(在測試代碼的時候使用斷言也是可接受的,是一種很方便的單元測試方法,你接受這些測試在用-O標志運行時不會做任何事。我有時在代碼里使用
assert False來標記沒有寫完的代碼分支,我希望這些代碼運行失敗。盡管拋出NotImplementedError可能會更好。)

關於斷言的意見有很多,因為它能確保代碼的正確性。如果你確定代碼是正確的,那麼就沒有用斷言的必要了,因為他們從來不會運行失敗,你可以直接移除這些斷言。如果你確定檢查會失敗,那麼如果你不用斷言,代碼就會通過編譯並忽略你的檢查。

在以上兩種情況下會很有意思,當你比較肯定代碼但是不是絕對肯定時。可能你會錯過一些非常古怪的情況。在這個情況下,額外的運行時檢查能幫你確保任何錯誤都會盡早地被捕捉到。

另一個好的使用斷言的方式是檢查程序的不變數。一個不變數是一些你需要依賴它為真的情況,除非一個bug導致它為假。如果有bug,最好能夠盡早發現,所以我們為它進行一個測試,但是又不想減慢代碼運行速度。所以就用斷言,因為它能在開發時打開,在產品階段關閉。

一個非變數的例子可能是,如果你的函數希望在它開始時有資料庫的連接,並且承諾在它返回的時候仍然保持連接,這就是函數的不變數:

Python

def some_function(arg):
assert not DB.closed()
... # code goes here
assert not DB.closed()
return result

斷言本身就是很好的注釋,勝過你直接寫注釋:

# when we reach here, we know that n > 2

你可以通過添加斷言來確保它:

assert n > 2

斷言也是一種防禦型編程。你不是讓你的代碼防禦現在的錯誤,而是防止在代碼修改後引發的錯誤。理想情況下,單元測試可以完成這樣的工作,可是需要面
對的現實是,它們通常是沒有完成的。人們可能在提交代碼前會忘了運行測試代碼。有一個內部檢查是另一個阻擋錯誤的防線,尤其是那些不明顯的錯誤,卻導致了
代碼出問題並且返回錯誤的結果。

加入你有一些if…elif 的語句塊,你知道在這之前一些需要有一些值:

# target is expected to be one of x, y, or z, and nothing else.
if target == x:
run_x_code()
elif target == y:
run_y_code()
else:
run_z_code()

假設代碼現在是完全正確的。但它會一直是正確的嗎?依賴的修改,代碼的修改。如果依賴修改成 target = w
會發生什麼,會關繫到run_w_code函數嗎?如果我們改變了代碼,但沒有修改這里的代碼,可能會導致錯誤的調用 run_z_code
函數並引發錯誤。用防禦型的方法來寫代碼會很好,它能讓代碼運行正確,或者立馬執行錯誤,即使你在未來對它進行了修改。

在代碼開頭的注釋很好的一步,但是人們經常懶得讀或者更新注釋。一旦發生這種情況,注釋會變得沒用。但有了斷言,我可以同時對代碼塊的假設書寫文檔,並且在它們違反的時候觸發一個干凈的錯誤

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()

這樣,斷言是一種防禦型編程,同時也是一種文檔。我想到一個更好的方案:

if target == x:
run_x_code()
elif target == y:
run_y_code()
elif target == z:
run_z_code()
else:
# This can never happen. But just in case it does...
raise RuntimeError("an unexpected error occurred")

按約定進行設計是斷言的另一個好的用途。我們想像函數與調用者之間有個約定,比如下面的:

「如果你傳給我一個非空字元串,我保證傳會字元串的第一個字母並將其大寫。」

如果約定被函數或調用這破壞,代碼就會出問題。我們說函數有一些前置條件和後置條件,所以函數就會這么寫:

def first_upper(astring):
assert isinstance(astring, str) and len(astring) > 0
result = astring[0].upper()
assert isinstance(result, str) and len(result) == 1
assert result == result.upper()
return result

按約定設計的目標是為了正確的編程,前置條件和後置條件是需要保持的。這是斷言的典型應用場景,因為一旦我們發布了沒有問題的代碼到產品中,程序會是正確的,並且我們能安全的移除檢查。

下面是建議的不要用斷言的場景:

不要用它測試用戶提供的數據
不要用斷言來檢查你覺得在你的程序的常規使用時會出錯的地方。斷言是用來檢查非常罕見的問題。你的用戶不應該看到任何斷言錯誤,如果他們看到了,這是一個bug,修復它。
有的情況下,不用斷言是因為它比精確的檢查要短,它不應該是懶碼農的偷懶方式。
不要用它來檢查對公共庫的輸入參數,因為它不能控制調用者,所以不能保證調用者會不會打破雙方的約定。
不要為你覺得可以恢復的錯誤用斷言。換句話說,不用改在產品代碼里捕捉到斷言錯誤。
不要用太多斷言以至於讓代碼很晦澀。

⑶ Python中何時使用斷言 assert

assert用於調試程序,如果與斷言不相符則會拋出異常,如:

a=0
asserta!=0,'aiszero'
#Traceback(mostrecentcalllast):
#File"<pyshell#93>",line1,in<mole>
#asserta!=0,'aiszero'
#AssertionError:aiszero

即如果斷言語句為False,拋出異常並列印字元串,如果斷言語句為True,則程序繼續執行。

⑷ python的assert怎麼用

1、assert斷言用來聲明某個條件是真的。
2、如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,並且在它非真的時候引發一個錯誤,那麼assert語句是應用在這種情形下的理想語句
3、當assert語句失敗的時候,會引發一AssertionError

測試代碼:
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
AssertionError
>>>

⑸ python 關於assert的用法,以下是完整代碼。 求助大家請問一下為什麼會報錯webDriver 的對象沒有 assert

是不是單詞寫錯了?
assertIsNone

⑹ python assert語句用法求大神支招

同時為True的時候不返回什麼,如果有一個或者全部為False,那麼會執行except下的語句。

⑺ python常用的斷言方式有哪些

(一)assertEqual 和 assertNotEqual
assertEqual:如兩個值相等,則pass
assertNotEqual:如兩個值不相等,則pass
下面看下具體使用方法
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.support.v7.app.ActionBar.e[2]").click()#切到超模25tab
sleep(3)
self.assertEqual(self.driver.find_element_by_id('com.boohee.secret:id/tv_title').text,u'超模25','切到超模25tab失敗')
(1)這邊是通過id(com.boohee.secret:id/tv_title)獲取它的text值,與預期「超模25」對比,如相等則pass;不相等則fail。
(2)後面的「切到超模25tab失敗」是fail時需要列印的信息,可寫可不寫。
斷言assertNotEqual反著用就可以了。
(二)assertTrue和assertFalse
assertTrue:判斷bool值為True,則pass
assertFalse:判斷bool值為False,則Pass
下面看下具體使用方法
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.TextView[1]").click()#點擊登錄入口
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.EditText[1]").send_keys("testq1")#輸入用戶名
sleep(2)
self.assertTrue(self.find_element_by_id('com.boohee.secret:id/btn_login').is_enabled(),'未輸密碼登錄按鈕為不可點狀態,Fail')
(1)這邊是通過id(com.boohee.secret:id/btn_login)獲取它的激活狀態,如為True則pass;反之則fail。
(2)後面的「未輸密碼登錄按鈕為不可點狀態」是fail時需要列印的信息,可寫可不寫。
斷言assertFalse反著用就可以了。
(三)assertIsNone和assertIsNotNone
assertIsNone:不存在,則pass
assertIsNotNone:存在,則pass
下面看下具體使用方法
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.TextView[1]").click()#點擊登錄入口
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.EditText[1]").send_keys("testq1")#輸入用戶名
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[2]/android.widget.EditText[1]").send_keys("boohee")#輸入密碼
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.Button[1]").click()#點擊登錄按鈕
sleep(10)
self.assertIsNotNone(self.driver.find_element_by_id('com.boohee.secret:id/tv_edit_profile'),'無編輯資料按鈕,登錄失敗,Fail')
(1)這邊是通過尋找id(com.boohee.secret:id/tv_edit_profile)的元素是否存在,如存在則pass;不存在則fail。
(2)後面的「無編輯資料按鈕,登錄失敗,Fail」是fail時需要列印的信息,可寫可不寫。
斷言assertIsNone反著用就可以了。

閱讀全文

與pythonassert用法相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:759
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:26
不能修改的pdf 瀏覽:750
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491