pythonassertin
『壹』 pthon 中獲取資料庫中的值用於斷言中時報錯,該怎麼解決,具體信息如下:
這個問題是如何在一些場景下使用斷言表達式,通常會有人誤用它,所以我決定寫一篇文章來說明何時使用斷言,什麼時候不用。
為那些還不清楚它的人,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,修復它。
有的情況下,不用斷言是因為它比精確的檢查要短,它不應該是懶碼農的偷懶方式。
不要用它來檢查對公共庫的輸入參數,因為它不能控制調用者,所以不能保證調用者會不會打破雙方的約定。
不要為你覺得可以恢復的錯誤用斷言。換句話說,不用改在產品代碼里捕捉到斷言錯誤。
不要用太多斷言以至於讓代碼很晦澀。
『貳』 python35個保留字是什麼
python35個保留字是['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']。
Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。這些平台包括linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS。
Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基於linux開發的android平台。
規范的代碼:
Python採用強制縮進的方式使得代碼具有較好可讀性。而Python語言寫的程序不需要編譯成二進制代碼。Python的作者設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。
其中很重要的一項就是Python的縮進規則。一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字元在這一行的位置來決定(而C語言是用一對大括弧「{}」(不含引號)來明確的定出模塊的邊界,與字元的位置毫無關系)。
通過強製程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。
『叄』 python的關鍵字有哪些,都是什麼意思
我這里匯總Python經常用到的27個關鍵字,希望對正在學Python的你能夠起到幫助
1 and:邏輯與
2 as:為導入的模塊取一個別名,在Python2.6中新增
3 assert:斷言,在Python1.5新增
4 break:用在循環語句,跳轉到語句塊的末尾
5 class:用來定義一個類
6 continue:和break香對應,跳到語句塊的開頭
7 def:用來定義一個函數或方法
8 del:刪除
9 elif:全稱是else if
10 exec:內置函數。執行以string類型存儲的Python代碼
11 finally:用在異常處理語句try-excep-finally中
12 for:著名的for循環,可以用來遍歷一個列表
13 from:字面意思,表示從一個包導入某個模塊
14 global:在函數或其他局部作用域中使用全局變數
15 if:如果
16 import:導入
17 in:在,後面跟一個列表,字典或字元串
18 is:邏輯判斷
19 not:邏輯非
20 or:邏輯或
21 pass:佔位符,用來告訴Python這里不用考慮
22 print:寫得最多的關鍵字,後來在Python3.0中變成了內置函數
23 raise:用來引發一個異常
24 return:函數返回
25 try:異常處理機制
26 while:while循環
27 with:在Python2.6中新增,使用with候不管with中的代碼出現什麼錯誤,都會進行對當前對象進行清理工作,注意該句話後面有一個冒號表示with語句。
以上就是我匯總的部分關鍵字,希望對你有所幫助
『肆』 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
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中何時使用斷言 assert
使用斷言表達式,通常會有人誤用它,所以我決定寫一篇文章來說明何時使用斷言,什麼時候不用。為那些還不清楚它的人,Python的assert是用來檢查一個條件,如果它為真,就不做任何事。如果它為假,則會拋出AssertError並且包含錯誤信息。例如:py>x=23py>assertx>0,"xisnotzeroornegative"py>assertx%2==0,"xisnotanevennumber"Traceback(mostrecentcalllast):File"",line1,inAssertionError:xisnotanevennumber很多人用assert作為一個很快和容易的方法來在參數錯誤的時候拋出異常。但這樣做是錯的,非常錯誤,有兩個原因。首先AssertError不是在測試參數時應該拋出的錯誤。你不應該像這樣寫代碼:ifnotisinstance(x,int):raiseAssertionError("notanint")你應該拋出TypeError的錯誤,assert會拋出錯誤的異常。但是,更危險的是,有一個關於assert的困擾:它可以被編譯好然後從來不執行,如果你用–O或–oo選項運行Python,結果不保證assert表達式會運行到。當適當的使用assert時,這是未來,但是當assert不恰當的使用時,它會讓代碼用-O執行時出錯。那什麼時候應該使用assert?沒有特定的規則,斷言應該用於:防禦型的編程運行時檢查程序邏輯檢查約定程序常量檢查文檔(在測試代碼的時候使用斷言也是可接受的,是一種很方便的單元測試方法,你接受這些測試在用-O標志運行時不會做任何事。我有時在代碼里使用assertFalse來標記沒有寫完的代碼分支,我希望這些代碼運行失敗。盡管拋出NotImplementedError可能會更好。)關於斷言的意見有很多,因為它能確保代碼的正確性。如果你確定代碼是正確的,那麼就沒有用斷言的必要了,因為他們從來不會運行失敗,你可以直接移除這些斷言。如果你確定檢查會失敗,那麼如果你不用斷言,代碼就會通過編譯並忽略你的檢查。在以上兩種情況下會很有意思,當你比較肯定代碼但是不是絕對肯定時。可能你會錯過一些非常古怪的情況。在這個情況下,額外的運行時檢查能幫你確保任何錯誤都會盡早地被捕捉到。另一個好的使用斷言的方式是檢查程序的不變數。一個不變數是一些你需要依賴它為真的情況,除非一個bug導致它為假。如果有bug,最好能夠盡早發現,所以我們為它進行一個測試,但是又不想減慢代碼運行速度。所以就用斷言,因為它能在開發時打開,在產品階段關閉。一個非變數的例子可能是,如果你的函數希望在它開始時有資料庫的連接,並且承諾在它返回的時候仍然保持連接,這就是函數的不變數:defsome_function(arg):assertnotDB.closed()#codegoeshereassertnotDB.closed()returnresult斷言本身就是很好的注釋,勝過你直接寫注釋:#whenwereachhere,weknowthatn>2你可以通過添加斷言來確保它:assertn>2斷言也是一種防禦型編程。你不是讓你的代碼防禦現在的錯誤,而是防止在代碼修改後引發的錯誤。理想情況下,單元測試可以完成這樣的工作,可是需要面對的現實是,它們通常是沒有完成的。人們可能在提交代碼前會忘了運行測試代碼。有一個內部檢查是另一個阻擋錯誤的防線,尤其是那些不明顯的錯誤,卻導致了代碼出問題並且返回錯誤的結果。加入你有一些if…elif的語句塊,你知道在這之前一些需要有一些值:#targetisexpectedtobeoneofx,y,orz,andnothingelse.iftarget==x:run_x_code()eliftarget==y:run_y_code()else:run_z_code()假設代碼現在是完全正確的。但它會一直是正確的嗎?依賴的修改,代碼的修改。如果依賴修改成target=w會發生什麼,會關繫到run_w_code函數嗎?如果我們改變了代碼,但沒有修改這里的代碼,可能會導致錯誤的調用run_z_code函數並引發錯誤。用防禦型的方法來寫代碼會很好,它能讓代碼運行正確,或者立馬執行錯誤,即使你在未來對它進行了修改。在代碼開頭的注釋很好的一步,但是人們經常懶得讀或者更新注釋。一旦發生這種情況,注釋會變得沒用。但有了斷言,我可以同時對代碼塊的假設書寫文檔,並且在它們違反的時候觸發一個干凈的錯誤asserttargetin(x,y,z)iftarget==x:run_x_code()eliftarget==y:run_y_code()else:asserttarget==zrun_z_code()這樣,斷言是一種防禦型編程,同時也是一種文檔。我想到一個更好的方案:iftarget==x:run_x_code()eliftarget==y:run_y_code()eliftarget==z:run_z_code()else:#Thiscanneverhappen.("anunexpectederroroccurred")按約定進行設計是斷言的另一個好的用途。我們想像函數與調用者之間有個約定,比如下面的:「如果你傳給我一個非空字元串,我保證傳會字元串的第一個字母並將其大寫。」如果約定被函數或調用這破壞,代碼就會出問題。我們說函數有一些前置條件和後置條件,所以函數就會這么寫:deffirst_upper(astring):assertisinstance(astring,str)andlen(astring)>0result=astring[0].upper()assertisinstance(result,str)andlen(result)==1assertresult==result.upper()returnresult按約定設計的目標是為了正確的編程,前置條件和後置條件是需要保持的。這是斷言的典型應用場景,因為一旦我們發布了沒有問題的代碼到產品中,程序會是正確的,並且我們能安全的移除檢查。下面是我建議的不要用斷言的場景:不要用它測試用戶提供的數據不要用斷言來檢查你覺得在你的程序的常規使用時會出錯的地方。斷言是用來檢查非常罕見的問題。你的用戶不應該看到任何斷言錯誤,如果他們看到了,這是一個bug,修復它。有的情況下,不用斷言是因為它比精確的檢查要短,它不應該是懶碼農的偷懶方式。不要用它來檢查對公共庫的輸入參數,因為它不能控制調用者,所以不能保證調用者會不會打破雙方的約定。不要為你覺得可以恢復的錯誤用斷言。換句話說,不用改在產品代碼里捕捉到斷言錯誤。不要用太多斷言以至於讓代碼很晦澀。
『柒』 python 測試 unittest Ran 0 tests in 0.000s怎麼破
你是在逗我嗎?我看你上面的Epl類都會定義,測試類你居然不會定義了
你將def EplTestCase(unittest,TestCase):改成class EplTestCase(unittest.TestCase):這行代碼你出現兩個錯誤class被定義成了def。unitest.TestCase中的點(.)被你寫成了逗號(,)
你測試用例的方法里也有錯
self.assertIn用於成員關系,所以你要寫成self.assertIn(self.EplTest.salary,[15000])
或者用self.assertEqual(self.EplTest.salary, 15000)
你第二個測試方法自定義加薪的方法裡面沒有一句用到了判斷的語法
『捌』 python語言保留字有哪些
保留字是Python語言中一些已經被賦予特定意義的單詞,這就要求開發者在開發程序時,不能用這些保留字作為標識符給變數、函數、類、模板以及其他對象命名。
Python包含的保留字可以執行如下命令進行查看:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
python保留字
需要注意的是,由於Python是嚴格區分大小寫的,保留字也不例外。所以,我們可以說if是保留字,但IF就不是保留字。
在實際開發中,如果使用Python中的保留字作為標識符,則解釋器會提示「invalid syntax」的錯誤信息
『玖』 Python中何時使用斷言 assert
assset 的主要用法
self.assertEqual(a,b,msg=msg) #判斷a與1.b是否一致,msg類似備注,可以為空
self.assertNotEqual(a,b,msg=msg) #判斷a與b是否不一致
self.assertTrue(a,msg=none) #判斷a是否為True
self.assertFalse(b,msg=none) #判斷b是否為false
self.assertIn(a,b) 判斷a in b是否成立,正確則True,否則為False
self.assertNotIn(a,b) 判斷a in b是否成立,不成立則True 否則 False
self.assertIs(a,b) 判斷a 與b的對象是否相同,成立則True,否則False
self.assertIsNot(a,b) 判斷a 與b的對象是否相同,不成立True,否則False
self.assertDictEqual(a,b) #判斷字典a和字典b是否相等,a,b為字典
self.assertDictContainsSubset
self.assertItemsEqual(a,b) #比較兩字元串是否一致,同sorted(a)==sorted(b)
self.assertMultiLineEqual(a,b) #比較a文本與b文本是否一致,即便多了個換行,也會區分
self.assertLess(a,b) #判斷a<b 成立則通過,否則失敗
self.assertLessEqual #判斷a<=b 成立則通過,否則失敗
self.assertGreater #判斷a>b 成立則通過,否則失敗
self.assertGreaterEqual #判斷a>=b 成立則通過,否則失敗
self.assertIsNone(obj=」」) #判斷obj=None 成立則通過,否則失敗
self.assertIsNotNone #判斷obj=None 成立則失敗,否則通過
self.assertIsInstance(a,b) #判斷a的數據類型是否為b,isinstance(a,b) 成立則通過,否則失敗
self.assertNotIsInstance #判斷同上相反
self.assertRegexpMatches(a,b) #正則匹配 同re.search(b,a)匹配有則成功,否則失敗,其中a為匹配的正則表達式,必須字元型,b 為要匹配的內容
self.assertNotRegexpMatches #同上,判斷相反
『拾』 Python有哪些語句
編程語言有那些它就那些
列印輸出
判斷分支
邏輯運算。