Python中的型別檢查
本文中所有程式碼均執行在Python 2.7上
為什麼要進行型別檢查?
總所周知,Python
是一門典型的動態語言,在變數定義、使用的過程中遵循duck typing,當對某一變數進行操作時才去檢查它是否支援該操作。這在大多數情況下沒有什麼問題。但有時我們希望當面對非法型別的引數的時候採取某些預設處理機制,來提高程式的健壯性,而不是直接丟擲異常停掉整個程式。
舉個例子:
def list_add(list1, list2):
for item in list2:
list1.append(item)
return list1
上面是一個很簡單的方法,將第二個列表中的元素依此追加在第一個列表之後。這要求list1
變數型別支援append
方法,list2
變數本身是可迭代的。如果我們傳入兩個int
型別的變數來呼叫這個方法,就會丟擲TypeError
的異常。
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 'instance'>
>>> type(b)
<type 'instance'>
可見,對於所有古典類,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型別
- JavaScript 中的型別檢查JavaScript型別
- 在Python 3中實現型別檢查器Python型別
- Vue中的靜態型別檢查Vue型別
- 型別檢查型別
- React的靜態型別檢查React型別
- C的動態型別檢查型別
- React手稿之型別檢查React型別
- 檢查型別是否溢位型別
- 建立自定義塊 - 型別檢查型別
- 編譯期型別檢查 in ClojureScript編譯型別
- Flow靜態型別檢查及在Vue專案中的使用型別Vue
- Python中的鴨子型別Python型別
- Flow:Facebook 的 JavaScript 靜態型別檢查器JavaScript型別
- GitHub 熱門:微軟新開源的 Python 靜態型別檢查器Github微軟Python型別
- React 快速上手 – 10 型別檢查 PropTypesReact型別
- React 快速上手 - 10 型別檢查 PropTypesReact型別
- JavaScript 需要檢查變數型別嗎JavaScript變數型別
- python 中如何判斷獲取檢視變數的型別Python變數型別
- Python 中的列舉型別Python型別
- python中的型別轉換Python型別
- oracle ckpt檢查點型別(增量及常規完全檢查點)checkpointOracle型別
- 你用過 PropTypes 的這些型別檢查麼?型別
- flow–facebook出品的javascript靜態型別檢查器JavaScript型別
- Flow_JS靜態型別檢查器JS型別
- SAP WM中階儲存型別的容量檢查– Check According to Maximum Weight型別
- Python中內建的NotImplemented型別Python型別
- 重拾Kotlin(10)-型別的檢查與轉換Kotlin型別
- vue2.0專案配置flow型別檢查Vue型別
- python-magic:檢測檔案的MIME型別Python型別
- 為你的 JavaScript 專案新增智慧提示和型別檢查JavaScript型別
- (四)Python中的字串型別及操作Python字串型別
- TypeScript防脫髮級入門——基本型別檢查TypeScript型別
- number資料型別在查詢中的顯示資料型別
- JavaScript安全的型別檢測JavaScript型別
- Python 中的鴨子型別和猴子補丁Python型別
- Python中容易被忽略的內建型別Python型別
- 深度解析javaScript常見資料型別檢查校驗JavaScript資料型別