Python中类型最佳判断方法
Python在定義變量的時(shí)候不用指明具體的的類型,解釋器會(huì)在運(yùn)行的時(shí)候會(huì)自動(dòng)檢查變量的類型,并根據(jù)需要進(jìn)行隱式的類型轉(zhuǎn)化,因?yàn)镻ython是動(dòng)態(tài)語言,所以一般情況下是不推薦進(jìn)行類型轉(zhuǎn)化的。
比如進(jìn)行"+"操作時(shí),如果加號(hào)兩邊是數(shù)據(jù)就進(jìn)行加法操作,如果兩邊是字符串就進(jìn)行字符串連接操作,如果兩邊是列表就進(jìn)行合并操作,甚至可以進(jìn)行復(fù)數(shù)的運(yùn)算。
解釋器會(huì)在運(yùn)行時(shí)根據(jù)兩邊的變量的類型調(diào)用不同的內(nèi)部方法。當(dāng)加號(hào)兩邊的變量類型不一樣的時(shí)候,又不能進(jìn)行類型轉(zhuǎn)化,就會(huì)拋出TypeError的異常。
types模塊從Python2到Python3的變化
在實(shí)際的開發(fā)中,為了提高代碼的健壯性,我們還是需要進(jìn)行類型檢查的。而進(jìn)行類型檢查首先想到的就是用types(),比如使用types判斷一個(gè)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) 復(fù)制代碼Result:
['nock', '100', 'IT'] 復(fù)制代碼我們?cè)趖ypes模塊中可以找到一些常用的類型,在2.6.9中顯示的結(jié)果:
types.BooleanType # bool類型 types.BufferType # buffer類型 types.BuiltinFunctionType # 內(nèi)建函數(shù),比如len() types.BuiltinMethodType # 內(nèi)建方法,指的是類中的方法 types.ClassType # 類類型 types.CodeType # 代碼塊類型 types.ComplexType # 復(fù)數(shù)類型 types.DictProxyType # 字典代理類型 types.DictType # 字典類型 types.DictionaryType # 字典備用的類型 types.EllipsisType # Ellipsis類型 types.FileType # 文件類型 types.FloatType # 浮點(diǎn)類型 types.FrameType # 框架對(duì)象的類型 types.FunctionType # 函數(shù)類型 types.GeneratorType # 通過調(diào)用生成器函數(shù)生成的generator-iterator對(duì)象類型 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴(kuò)展模塊中定義的對(duì)象的類型 types.InstanceType # 實(shí)例類型 types.IntType # int類型 types.LambdaType # lambda類型 types.ListType # 列表類型 types.LongType # long類型 types.MemberDescriptorType # 在擴(kuò)展模塊中定義的對(duì)象類型,包括PyMemberDef,如datetime.timedelta.days types.MethodType # 方法類型 types.ModuleType # module類型 types.NoneType # None類型 types.NotImplementedType # NotImplemented的類型 types.ObjectType # object類型 types.SliceType # slice()返回的對(duì)象類型 types.StringType # 字符串類型 types.StringTypes # 一個(gè)包含StringType和UnicodeType的序列,用于方便對(duì)任何字符串對(duì)象進(jìn)行檢查。 types.TracebackType # 在sys.exc_traceback中發(fā)現(xiàn)的traceback對(duì)象的類型。 types.TupleType # 元組類型 types.TypeType # 類型本身 types.UnboundMethodType # 另一個(gè)名字for MethodType types.UnicodeType # Unicode字符字符串的類型(例如,u ' spam) types.XRangeType # xrange()返回的范圍對(duì)象的類型 復(fù)制代碼官網(wǎng)介紹:https://docs.python.org/2/library/types.html
到了Python3版本,types模塊方法已經(jīng)明顯減少了很多,具體如下:
types.BuiltinFunctionType types.BuiltinMethodType # 內(nèi)置函數(shù)的類型,如len()或sys.exit(),以及內(nèi)置類的方法。(這里,“內(nèi)置”的意思是“用C寫”。) types.CodeType # 通過compile()返回的代碼對(duì)象類型。 types.DynamicClassAttribute types.FrameType # 框架對(duì)象的類型,如在tb中發(fā)現(xiàn)的。tb_frame如果tb是一個(gè)traceback對(duì)象。 types.FunctionType types.GeneratorType # 由生成器函數(shù)創(chuàng)建的generator - iterator對(duì)象類型。 types.GetSetDescriptorType # 用PyGetSetDef(如FrameType)在擴(kuò)展模塊中定義的對(duì)象的類型。 types.LambdaType # 由lambda表達(dá)式創(chuàng)建的用戶定義函數(shù)和函數(shù)的類型。 types.MappingProxyType types.MemberDescriptorType types.MethodType # 用戶定義類實(shí)例的方法類型。 types.ModuleType types.SimpleNamespace types.TracebackType # traceback對(duì)象的類型,如sys.exc_info() types.new_class types.prepare_class 復(fù)制代碼官網(wǎng)介紹:https://docs.python.org/3/library/types.html#module-types
不推薦使用type檢查類型
從上面的Python2到Python3的版本升級(jí)過程中,types模塊方法有所減少。如果使用type方法也會(huì)存在如下問題:
如上所示說明i和n的類型是不一樣的,而實(shí)際上UserInt是繼承int的,所以這個(gè)判斷是存在問題的,當(dāng)我們對(duì)Python內(nèi)建類型進(jìn)行擴(kuò)展的時(shí)候,type返回的結(jié)果就不夠準(zhǔn)確了。我們?cè)倏匆粋€(gè)例子:
type比較的結(jié)果a和b的類型是一樣的,結(jié)果明顯是不準(zhǔn)確的。這種古典類的實(shí)例,type返回的結(jié)果都是一樣的,而這樣的結(jié)果不是我們想要的。對(duì)于內(nèi)建的基本類型來說,使用tpye來檢查是沒有問題的, 可是當(dāng)應(yīng)用到其他場(chǎng)合的時(shí)候,type就顯得不可靠了。這個(gè)時(shí)候我們就需要使用內(nèi)置函數(shù)isinstance來進(jìn)行類型檢查,示例如下:
isinstance(object, class_or_type_or_tuple) 復(fù)制代碼object表示對(duì)象,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 復(fù)制代碼Python2有為非浮點(diǎn)數(shù)準(zhǔn)備的int和long類型。int類型的最大值不能超過sys.maxint,而且這個(gè)最大值是平臺(tái)相關(guān)的。可以通過在數(shù)字的末尾附上一個(gè)L來定義長整型,顯然,它比int類型表示的數(shù)字范圍更大。在Python3里,只有一種整數(shù)類型int,大多數(shù)情況下,它很像Python2里的長整型。由于已經(jīng)不存在兩種類型的整數(shù),所以就沒有必要使用特殊的語法去區(qū)別他們, 進(jìn)一步閱讀:PEP 237。
最后在Python中類型的判斷你最好的方法是利用內(nèi)置函數(shù)isinstance完成是最佳體驗(yàn)。
官網(wǎng)介紹:https://docs.python.org/3/library/functions.html#isinstance
總結(jié)
以上是生活随笔為你收集整理的Python中类型最佳判断方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一张图看懂CDN全站加速产品解决方案
- 下一篇: win驱动下线程操作相关函数封装