assertpython
⑴ python3 assert和return的區別
assert是斷言語句,判斷其後的表達式是否為真,如果值為False則退出程序,是用來調試程序的語句
return 用於從函數中返回(值)
兩者沒有聯系
⑵ 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
>>>
⑶ python3關於assert的問題
因為你在每個循環里調用了兩次next,assert的是第一次,print的是第二次
⑷ 如何關閉assert運行python
打開cmd,在你要運行的python文件的目錄下輸入:
python -O 文件名
即可跳過文件中的assert檢查
舉例:下面的程序是輸入年齡滿18 歲時輸出『welcome』,否則assert檢查不通過,拋出異常
⑸ python程序在本地電腦沒問題,上傳到遠程伺服器提示assert錯誤
python中的assert是一種最簡單的異常機制。
assert斷言是聲明其布爾值必須為真的判定,如果發生異常就說明表達示為假。可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發異常。啟動Python解釋器時可以用-O參數來關閉assert。
assert的意思是,表達式n。=0應該是True,否則,根據程序運行的邏輯,後面的代碼肯定會出錯。如果斷言失敗,assert語句本身就會拋出AssertionError。
⑹ Python中何時使用斷言 assert
1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false2.斷言可以用於檢查傳遞給私有方法的參數。(對於公有方法,因為是提供給外部的介面,所以必須在方法中有相應的參數檢驗才能保證代碼的健壯性)3.使用斷言測試方法執行的前置條件和後置條件4.使用斷言檢查類的不變狀態,確保任何情況下,某個變數的狀態必須滿足。(如age屬性應大於0小於某個合適值)不用斷言斷言語句不是永遠會執行,可以屏蔽也可以啟用因此:1.不要使用斷言作為公共方法的參數檢查,公共方法的參數永遠都要執行2.斷言語句不可以有任何邊界效應,不要使用斷言語句去修改變數和改變方法的返回值.C里的宏宏名: assert功 能: 測試一個條件並可能使程序終止用 法: void assert(int test);程序例: #include<assert.h>#include<stdio.h>#include<stdlib.h>struct ITEM{ int key; int value;};/*add item to list,make sure list is not null*/void additem(struct ITEM* itemptr){ assert(itemptr!=NULL); /*additemtolist*/}int main(void){ additem(NULL); return 0;}assert() 宏用法注意:assert是宏,而不是函數。在C的assert.h頭文件中。assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程序執行,原型定義: #defineassert(expr)\((expr)\?__ASSERT_VOID_CAST(0)\:__assert_fail(__STRING(expr),__FILE__,__LINE__,__ASSERT_FUNCTION))/*DefinedInGlibc2.15*/assert的作用是先計算表達式expr,如果其值為假(即為0),那麼它會列印出來assert的內容和__FILE__, __LINE__, __ASSERT_FUNCTION,然後執行abort()函數使kernel殺掉自己並coremp(是否生成coremp文件,取決於系統配置);否則,assert()無任何作用。宏assert()一般用於確認程序的正常操作,其中表達式構造無錯時才為真值。完成調試後,不必從源代碼中刪除assert()語句,因為宏NDEBUG有定義時,宏assert()的定義為空。 請看下面的程序清單badptr.c: #include<stdio.h>#include<assert.h>#include<stdlib.h>int main(void){ FILE* fp; fp=fopen(test.txt,w);//以可寫的方式打開一個文件,如果不存在就創建一個同名文件 assert(fp);//所以這里不會出錯 fclose(fp); fp=fopen(noexitfile.txt,r);//以只讀的方式打開一個文件,如果不存在就打開文件失敗 assert(fp);//所以這里出錯 fclose(fp);//程序永遠都執行不到這里來 return 0;}[root@localhost error_process]# gcc badptr.c[root@localhost error_process]# ./a.outa.out: badptr.c:14: main: Assertion `fp' failed.如果使用動態鏈接libc,那麼除了__FILE__, __LINE__, __ASSERT_FUNCTION會讓目標變的稍稍大了一點,並不會因為多次使用assert()增加目標很多。不過好處也很明顯,就是會在assert的地方會列印出來文件名,行數,和函數名。另外,要注意用assert()的錯誤程度。如果assert()的條件fail了,那麼會調用abort()函數讓kernel殺掉自己,哪怕用戶自己重新注冊了SIGABRT信號的行為(abort()會先向自己發送信號SIGABRT保證用戶的handler正確執行,然後修改SIGABRT信號的行為為默認行為coremp,再次像自己發送SIGABRT,coremp)。在調試結束後,可以通過在包含#include <assert.h>的語句之前插入 #define NDEBUG 來禁用assert調用,示例代碼如下:#include <stdio.h>#define NDEBUG#include <assert.h>用法總結與注意事項:1)在函數開始處檢驗傳入參數的合法性如:int resetBufferSize(int nNewSize){ //功能:改變緩沖區大小, //參數:nNewSize緩沖區新長度 //返回值:緩沖區當前長度 //說明:保持原信息內容不變 nNewSize<=0表示清除緩沖區 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); ...}2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗/***不好***/assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);/****好****/assert(nOffset >= 0);assert(nOffset+nSize <= m_nInfomationSize);3)不能使用改變環境的語句,因為assert只在DEBUG生效,如果這么做,會使用程序在真正運行時遇到問題錯誤: assert(i++ < 100)這是因為如果出錯,比如在執行之前i=100,那麼這條語句就不會執行,那麼i++這條命令就沒有執行。正確: assert(i < 100)i++;4)assert和後面的語句應空一行,以形成邏輯和視覺上的一致感5)有的地方,assert不能代替條件過濾注意:當對於浮點數:#include<assert.h>float pi=3.14f;assert (pi==3.14f);在switch語句中總是要有default子句來顯示信息(Assert)。int number = SomeMethod();switch(number){case 1: Trace.WriteLine(Case 1:);break;case 2: Trace.WriteLine(Case 2:);break;default : Debug.Assert(false);break;}
⑺ 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,最好能夠盡早發現,所以我們為它進行一個測試,但是又不想減慢代碼運行速度。所以就用斷言,因為它能在開發時打開,在產品階段關閉。
一個非變數的例子可能是,如果你的函數希望在它開始時有資料庫的連接,並且承諾在它返回的時候仍然保持連接,這就是函數的不變數:
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是什麼意思呢
>>>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 assert語句用法求大神支招
同時為True的時候不返回什麼,如果有一個或者全部為False,那麼會執行except下的語句。
⑽ Python 如何用 assert() 終止程序
python assert斷言是聲明布爾值必須為真的判定,如果發生異常就說明表達式為假。
可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發異常。
參考:網頁鏈接