摘要:列表越界的列表類似于動態(tài)數(shù)組,沒有長度的限制。比如對將要傳進內(nèi)層函數(shù)的參數(shù)進行檢測等,從而實現(xiàn)對參數(shù)的類型進行限制。對二維列表的每一維列表進行長度限制,不足指定長度,自動補充指定元素。
前言
作為一名python的腦殘粉,請先跟我念一遍python大法好。
其作為動態(tài)語言的靈活,簡介的代碼,確實在某些情況下確實比其他編程語言要好。但你有沒有想過,有時這些靈活的語法,可能會造成一些糟糕的體驗。尤其是針對新手,python易上手不假,但動態(tài)語言寫得項目規(guī)模一大,其實比相對嚴謹?shù)撵o態(tài)語言,更考驗程序員的內(nèi)力。
哪怕你只是用過python寫過一些初等的項目,那你可能也體驗過以下這種情況。
莫名其妙的傳錯參數(shù)類型。
python不需要顯式聲明參數(shù)類型,同樣,什么樣的變量都可以往函數(shù)里扔,包括函數(shù)(python支持函數(shù)式編程),這容易出現(xiàn)一個問題,如果一個函數(shù)不是自己設計的,你很可能網(wǎng)里面?zhèn)髁隋e誤類型的參數(shù)。當然,這樣大多數(shù)觸發(fā)異常,因為傳錯類型意味著函數(shù)的一些操作該類型不支持。但有時傳了錯誤的參數(shù)類型,卻并不會觸發(fā)異常(比如字符串相加和數(shù)字相加,以及一切對象的==判斷),不會觸發(fā)異常結果卻是錯誤的,這就意味著出現(xiàn)了問題更難確定位置,甚至如果這個函數(shù)的返回值,再傳進其他函數(shù)(假設叫B)時,當你發(fā)現(xiàn)得到結果錯誤時,你很可能以為是B函數(shù)的邏輯設計出現(xiàn)了錯誤,從而花費大量的時間在錯誤的地方,使用python多數(shù)是對開發(fā)效率比較重要的場景,而很可能因為一個粗心,使得寫代碼的時間短了,結果將時間都花在找BUG上了。
進行操作之前忘記了轉型
典型的就是把參數(shù)類型為str與int相加。或者把str傳進range()里面。
列表越界
python的列表類似于動態(tài)數(shù)組,沒有長度的限制。雖然大多數(shù)我們只需用for x in one_list即可完成對列表的訪問,而不需要去考慮列表的長度。但其實還有一種情景,比如說一個列表(或者元組)中元素的次序是有意義的,比如說[name,age,sex]而且這可能是某個函數(shù)動態(tài)生成的,比如爬蟲爬取網(wǎng)站后從里面挑選信息后返回,這時,如果這個網(wǎng)站中age,sex的信息缺失,python可不會自動補充None下去,至少我沒看見有人的函數(shù)或方法會考慮到這一點,而是直接給你返回[name],而如果你需要獲取age,而直接訪問下標為1的元素,則會觸發(fā)異常。
類似的還有種種,當然并非不可解決,比如足夠多的assert和isinstance,足夠嚴謹?shù)倪壿嬙O計,枯燥但很有必要的單元測試等等……但使用python很多時候就是為了加快開發(fā)效率,上面的這些措施顯然太過麻煩。
斷斷續(xù)續(xù)的寫了一兩天,弄了幾個裝飾器來解決這些問題,下面開始分享一下。
什么是裝飾器如何利用裝飾器限制函數(shù)的參數(shù)和返回值需要了解pythopn中裝飾器的基本概念,可以參考一下廖老師的py教程
點這里
使用裝飾器可以使得一個函數(shù)外面加上某些操作然后在重新返回到你定義的函數(shù)名字指定的對象上。
說實話,我很難用言語描述出這種關系,直接上代碼好了。
以使用裝飾器限制函數(shù)參數(shù)類型為例:
裝飾器的實現(xiàn)如下:
def type_limit(*typeLimit,**returnType): def test_value_type(func): def wrapper(*param,**kw): length = len(typeLimit) if length != len(param): raise LimitError("The list of typeLimit and param must have the same length") for index in range(length): t = typeLimit[index] p = param[index] if not isinstance(p,t): raise LimitError("The param %s should be %s,but it"s %s now!"%(str(p),type(t()),type(p))) res = func(*param,**kw) if "returnType" in returnType: limit = returnType["returnType"] if not isinstance(res,limit): raise LimitError("This function must return a value that is %s,but now it"s %s"%(limit,type(res) ) ) return res return wrapper return test_value_type
假設我希望實現(xiàn)一個函數(shù),實現(xiàn)兩數(shù)求和,為了避免傳進去的是兩個字符串,造成字符串連接,我需要限制其類型都為int
這時,我們可以這么做:
@type_limit(int,int) def test(x,y): return x+y
這個定義的過程發(fā)生了什么呢?上述代碼等價于
temp = type_limit(int,int) #temp = test_value_type test = temp(test) #這是,test已經(jīng)在原test上經(jīng)過修飾,指向wrapper
而在wrapper中,最終會返回調(diào)用原test的結果,這個裝飾器做的,只不過是在調(diào)用原test前,利用
isinstance進行了一遍類型檢測而已。這樣,我們可以簡單的模仿像java,C++這樣的靜態(tài)語言一樣,在聲明的時候就對參數(shù)類型進行限制了。
理解這個裝飾器把握著一下幾點:
函數(shù)可以作為變量使用,即可以作為參數(shù)和返回值
裝飾器利用了函數(shù)內(nèi)的函數(shù),可以訪問外層函數(shù)之間的一些變量從而對內(nèi)層函數(shù)進行修飾。(比如對將要傳進內(nèi)層函數(shù)的參數(shù)進行檢測等),從而實現(xiàn)對參數(shù)的類型進行限制。
理解這兩點后,你可以自由的修改和拓展這些裝飾器,如果你有更好的實現(xiàn),記得在github上pull給我哦,github地址稍后給出。
其他相關的限制除上述外,我還是實現(xiàn)了其他限制:
列表長度的限制,不足指定長度,自動補充指定元素。
對二維列表的每一維列表進行長度限制,不足指定長度,自動補充指定元素。主要為某些算法進行限制。
常量類Const,目測沒有什么用
對列表的每一元素的類型進行限制
后記限于篇幅,其他的代碼不一一在這里介紹,關鍵思路在上文已給出,其余代碼開源在github上,如果需要,你可以直接拿去使用。不過記得不要濫用。
github地址
如有更好的建議和或不正確的地方,可以在本文或github下告知。
如有錯別字……請忽略(^ ^)
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45429.html
摘要:的裝飾器中的同樣借鑒了這個語法糖,不過依賴于的方法。等同于也就是說,裝飾器是一個對類進行處理的函數(shù)。別名或裝飾器在控制臺顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫上面的代碼。 更多文章,請在Github blog查看 在 ES6 中增加了對類對象的相關定義和操作(比如 class 和 extends ),這就使得我們在多個不同類之間共享或者擴展一些方法或者行為的時候,變得并...
摘要:屬性有三個裝飾器。當屬性只有方法,則為只有只讀屬性。使用規(guī)則只讀屬性只有方法,在方法前加上可讀可寫屬性有和方法,在方法上使用屬性名。 @property @property是內(nèi)置的裝飾器,與普通裝飾器原理是一樣的,只不過返回的不是函數(shù),而是類對象. @property負責把一個方法變成屬性進行調(diào)用,保證對參數(shù)進行必要的檢查。 屬性有三個裝飾器:setter、getter、dele...
摘要:本章主要是對上一章類的補充。對于多態(tài)的補充子類可以被看成是父類的類型,但父類不能被看成是子類的類型。仍然以類為例,動物里有哺乳動物,卵生動物,有能飛的動物和不能飛的動物,這是兩種大的分類方式。一般在中,以為結尾類的都作為接口。 《Python編程:從入門到實踐》筆記。本章主要是對上一章Python類的補充。 1. 從一個類派生出所有類 上一篇文章說道Python類的定義與繼承一般是如下...
摘要:內(nèi)置函數(shù)實現(xiàn)對可迭代對象進行進一步處理。文件文件的打開權限打開文件,文件不存在報異常寫入文件,文件不存在則創(chuàng)建。文件不存在則創(chuàng)建。追加文件,具有讀寫權限。 Python基礎類型: 1.Tuple元組,內(nèi)容不可改變,但是允許元素內(nèi)部存在list等類型的元素,并且允許改變列表的值,所謂內(nèi)容不可變指的是在內(nèi)存中指向的地址是不變的。 temp=(1,2,[3,4]) temp[-1]....
摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡化上面的寫法像上面的情況,可以動態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標題為會打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...
閱讀 1123·2021-11-24 09:39
閱讀 3623·2021-09-02 15:21
閱讀 2161·2021-08-24 10:01
閱讀 722·2021-08-19 10:55
閱讀 2447·2019-08-30 15:55
閱讀 1212·2019-08-30 14:16
閱讀 2992·2019-08-29 15:17
閱讀 3235·2019-08-29 13:53