Python中类型最佳判断方法
Python在定義變量的時候不用指明具體的的類型,解釋器會在運行的時候會自動檢查變量的類型,并根據需要進行隱式的類型轉化,因為Python是動態語言,所以一般情況下是不推薦進行類型轉化的。
比如進行"+"操作時,如果加號兩邊是數據就進行加法操作,如果兩邊是字符串就進行字符串連接操作,如果兩邊是列表就進行合并操作,甚至可以進行復數的運算。
解釋器會在運行時根據兩邊的變量的類型調用不同的內部方法。當加號兩邊的變量類型不一樣的時候,又不能進行類型轉化,就會拋出TypeError的異常。
types模塊從Python2到Python3的變化
在實際的開發中,為了提高代碼的健壯性,我們還是需要進行類型檢查的。而進行類型檢查首先想到的就是用types(),比如使用types判斷一個int類型:
Source Code:
#!/usr/bin/env python2.6 #Author: nock.chen from types import * mylist = ['nock', 100, '100', 'IT']def delete(mylist, item): if type(item) is IntType:mylist.remove(item)delete(mylist, 100) print(mylist) 復制代碼Result:
['nock', '100', 'IT'] 復制代碼我們在types模塊中可以找到一些常用的類型,在2.6.9中顯示的結果:
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 # Ellipsis類型 types.FileType # 文件類型 types.FloatType # 浮點類型 types.FrameType # 框架對象的類型 types.FunctionType # 函數類型 types.GeneratorType # 通過調用生成器函數生成的generator-iterator對象類型 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴展模塊中定義的對象的類型 types.InstanceType # 實例類型 types.IntType # int類型 types.LambdaType # lambda類型 types.ListType # 列表類型 types.LongType # long類型 types.MemberDescriptorType # 在擴展模塊中定義的對象類型,包括PyMemberDef,如datetime.timedelta.days types.MethodType # 方法類型 types.ModuleType # module類型 types.NoneType # None類型 types.NotImplementedType # NotImplemented的類型 types.ObjectType # object類型 types.SliceType # slice()返回的對象類型 types.StringType # 字符串類型 types.StringTypes # 一個包含StringType和UnicodeType的序列,用于方便對任何字符串對象進行檢查。 types.TracebackType # 在sys.exc_traceback中發現的traceback對象的類型。 types.TupleType # 元組類型 types.TypeType # 類型本身 types.UnboundMethodType # 另一個名字for MethodType types.UnicodeType # Unicode字符字符串的類型(例如,u ' spam) types.XRangeType # xrange()返回的范圍對象的類型 復制代碼官網介紹:https://docs.python.org/2/library/types.html
到了Python3版本,types模塊方法已經明顯減少了很多,具體如下:
types.BuiltinFunctionType types.BuiltinMethodType # 內置函數的類型,如len()或sys.exit(),以及內置類的方法。(這里,“內置”的意思是“用C寫”。) types.CodeType # 通過compile()返回的代碼對象類型。 types.DynamicClassAttribute types.FrameType # 框架對象的類型,如在tb中發現的。tb_frame如果tb是一個traceback對象。 types.FunctionType types.GeneratorType # 由生成器函數創建的generator - iterator對象類型。 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴展模塊中定義的對象的類型。 types.LambdaType # 由lambda表達式創建的用戶定義函數和函數的類型。 types.MappingProxyType types.MemberDescriptorType types.MethodType # 用戶定義類實例的方法類型。 types.ModuleType types.SimpleNamespace types.TracebackType # traceback對象的類型,如sys.exc_info() types.new_class types.prepare_class 復制代碼官網介紹:https://docs.python.org/3/library/types.html#module-types
不推薦使用type檢查類型
從上面的Python2到Python3的版本升級過程中,types模塊方法有所減少。如果使用type方法也會存在如下問題:
如上所示說明i和n的類型是不一樣的,而實際上UserInt是繼承int的,所以這個判斷是存在問題的,當我們對Python內建類型進行擴展的時候,type返回的結果就不夠準確了。我們再看一個例子:
type比較的結果a和b的類型是一樣的,結果明顯是不準確的。這種古典類的實例,type返回的結果都是一樣的,而這樣的結果不是我們想要的。對于內建的基本類型來說,使用tpye來檢查是沒有問題的, 可是當應用到其他場合的時候,type就顯得不可靠了。這個時候我們就需要使用內置函數isinstance來進行類型檢查,示例如下:
isinstance(object, class_or_type_or_tuple) 復制代碼object表示對象,classinfo可以是直接或間接類名、基本類型或者有它們組成的元組。
nock:ucode nock$ python3 Python 3.5.1 (default, Dec 26 2015, 18:08:53) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> isinstance(2, float) False >>> isinstance(2, int) True >>> isinstance((2, 3), list) False >>> isinstance((2, 3), tuple) True >>> isinstance({'name': 'nock'}, tuple) False >>> isinstance({'name': 'nock'}, dict) True >>> isinstance([1, 100, 101], (str, list, tuple)) True >>> isinstance(2 ** 31, dict) False >>> isinstance(2 ** 31, long) Traceback (most recent call last):File "<stdin>", line 1, in <module> NameError: name 'long' is not defined >>> isinstance(2 ** 31, int) True 復制代碼Python2有為非浮點數準備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個最大值是平臺相關的。可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int類型表示的數字范圍更大。在Python3里,只有一種整數類型int,大多數情況下,它很像Python2里的長整型。由于已經不存在兩種類型的整數,所以就沒有必要使用特殊的語法去區別他們, 進一步閱讀:PEP 237。
最后在Python中類型的判斷你最好的方法是利用內置函數isinstance完成是最佳體驗。
官網介紹:https://docs.python.org/3/library/functions.html#isinstance
總結
以上是生活随笔為你收集整理的Python中类型最佳判断方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一张图看懂CDN全站加速产品解决方案
- 下一篇: 6月 Python 开源项目 Top10