Python数据类型判断常遇到的坑
python判斷變量數據類型時,建議使用isinstance()方法代替type(). 進行類型檢查首先想到的就是用type(),但是Type在某些特定情況下判斷類型存在問題,今天就來說下type在python類型判斷時的坑。
type()方法
例子: int類型判斷
>>> import types >>> type(2017)==types.IntType TruePython2.7中的types類型:
types.BooleanType # bool類型 types.BufferType # buffer類型 types.BuiltinFunctionType # 內建函數,比如len() types.BuiltinMethodType # 內建方法,指的是類中的方法 types.ClassType # 類類型 types.CodeType # 代碼塊類型 types.ComplexType # 復數類型 types.DictProxyType # 字典代理類型 types.DictType # 字典類型 types.DictionaryType # 字典備用的類型 types.EllipsisType types.FileType # 文件類型 types.FloatType # 浮點類型 types.FrameType types.FunctionType # 函數類型 types.GeneratorType types.GetSetDescriptorType types.InstanceType # 實例類型 types.IntType # int類型 types.LambdaType # lambda類型 types.ListType # 列表類型 types.LongType # long類型 types.MemberDescriptorType types.MethodType # 方法類型 types.ModuleType # module類型 types.NoneType # None類型 types.NotImplementedType types.ObjectType # object類型 types.SliceTypeh types.StringType # 字符串類型 types.StringTypes types.TracebackType types.TupleType # 元組類型 types.TypeType # 類型本身 types.UnboundMethodType types.UnicodeType types.XRangeTypePython3.x中的types類型:
types.BuiltinFunctionType types.BuiltinMethodType types.CodeType types.DynamicClassAttribute types.FrameType types.FunctionType types.GeneratorType types.GetSetDescriptorType types.LambdaType types.MappingProxyType types.MemberDescriptorType types.MethodType types.ModuleType types.SimpleNamespace types.TracebackType types.new_class types.prepare_classPython3.x進行了類型的精簡
isinstance方法
isinstance(object, classinfo)object表示實例,classinfo可以是直接或間接類名、基本類型或者有它們組成的元組。
基本用法
>>> isinstance(1, int) True >>> >>> isinstance('pythontab.com', (str, int)) # 是其中一種即可 True >>> isinstance(100, (str, int)) # 是其中一種即可 True上面type的例子可以表示為:
>>> import types >>> isinstance(2017,int) True那為什么不推薦使用type進行類型檢查呢?
我們來看一下下面的例子。
import types class UserInt(int):def __init__(self, val=0):self.val = int(val) i = 1 n = UserInt(2) print(type(i) is type(n))上面的代碼輸出:False
這就說明i和n的類型是不一樣的,而實際上UserInt是繼承自int的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。我們再看一個例子。
class ca:pass class cb:pass a = ca() b = cb() print (type(a) is type(b))代碼的輸出結果: True
注意: 這個例子僅僅針對Python2.x版本, Python3.x版本中會返回Flase,不存在該問題
type比較的結果a和b的類型是一樣的,結果明顯是不準確的。在old-style class中,任意instance的type都是’instance’。所以絕對不能用type來判斷其類型。
另外這個問題又與Python的思想有關,正常情況下不應該編寫代碼檢查類型的,而應該直接假設被操作的instance具有你希望的屬性,否則拋出異常。即使需要檢查類型,也應該用isinstance來判斷,這樣你期望類型的subclass也能正常被處理(比如,一個函數需要處理Message類型,那么它應該也能處理Message的子類型MyMessage,所以應該使用isinstance(arg,Message)這樣來判斷而不是type(arg) == Message來判斷)
結論:
盡量不要使用type()方法,多使用isinstance(),這樣可以減少錯誤。
總結
以上是生活随笔為你收集整理的Python数据类型判断常遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数每日一讲 - cmp(x
- 下一篇: Python中带下划线_的变量和函数命名