本文中所有**均執行在python 2.7上
為什麼要進行型別檢查?
總所周知,python是一門典型的動態語言,在變數定義、使用的過程中遵循duck typing,當對某一變數進行操作時才去檢查它是否支援該操作。這在大多數情況下沒有什麼問題。但有時我們希望當面對非法型別的引數的時候採取某些預設處理機制,來提高程式的健壯性,而不是直接丟擲異常停掉整個程式。
舉個例子:
def list_add(list1, list2):
for item in list2:
return list1
type
在進行型別檢查的時候,大多數人至少都會知道使用type方法,這是比較常見的方法。
再來幾個例子:
>>> import typea
>>> type(1) is types.inttype
true
>>> type(true) is types.booleantype
true
>>> type(1.22) is types.stringtype
false
看起來不錯,似乎可以應付絕大多數情況,但有的時候還是會有點問題:
import types
# 我們建立了乙個繼承自int的類,不進行任何重寫,按照duck typing的原則,它應該被按照int進行處理
>>> class a(int):
... pass
>>> b = a()
>>> type(b) is types.inttype
false
可見,基於python內建(bult-in)型別的自定義型別,python並不能返回我們期望的結果。
不僅如此,type對於古典類(古典類和新式類的區別)的型別判斷似乎也有點問題:
>>> class a:
... pass
>>> class b:
... pass
>>> a = a()
>>> b = b()
>>> type(a) == type(b)
true
>>> type(a)
>>> type(b)
可見,對於所有古典類,type返回的結果是一樣的。
綜上所述,對於常見的內建型別,type可以返回我們期望的結果,但在某些情形下,似乎會有點問題。
isinstance
isinstance可以解決上面所提到的type可能存在的問題。
首先看一下常見情況下:
>>> isinstance(1, int)
true
>>> isinstance('hello', basestring)
true
>>> isinstance(1.23, float)
true
>>> isinstance([1,2], dict)
false
接下來看看對於繼承自內建型別的自定義型別的判斷:
>>> class a(int):
... pass
>>> a = a()
>>> isinstance(a, int)
true
之後來看看古典類的情況:
>>> class a:
... pass
>>> class b:
... pass
>>> a = a()
>>> b = b()
>>> isinstance(a, a)
true
>>> isinstance(a, b)
false
>>> isinstance(b, b)
true
>>> isinstance(b, a)
false
得到了我們所期望的效果。
總結鑑於在某些情況下,type()可能會出現的問題,為確保程式的正常執行,一般情況下推薦使用isinstance()來進行型別判斷。
python 函式引數型別檢查
python在3.5後引入了引數型別註解,例 def add x int,y int int 對x,y和返回值都進行注釋,為int型別 return x y注 註解是對函式引數和返回值的 注釋 沒有強制定義的作用 因為python是動態語言啊 那麼既然註解不能強制定義型別,在函式呼叫中怎麼判斷傳入的...
python 函式引數型別檢查
在python中,不知道函式引數型別是乙個很正常的事情,特別是在乙個大專案裡。我見過有些專案裡,每乙個函式體的前十幾行都在檢查引數型別,這實在是太麻煩了。而且一旦引數有改動,這部分也需要改動。下面我們用裝飾器來實現,函式引數的強制型別檢查。首先,這個裝飾器,要接受型別引數,和指定函式引數的型別引數。...
python 資料型別檢查
資料型別檢查 在實際介面自動化測試過程中,我們會發現介面的很多入參引數都標記了 string int float array等等 這就迫使我們對入參得作下檢查工作,不然執行完成後,出錯了,少的還能快速找到問題,多了的話定位問題都要找半天。首先,第一種是這樣的 def function check n...