這篇文章主要介紹了七個(gè)初學(xué)者常犯的Python調(diào)試錯(cuò)誤,并告訴大家如何去避免這些錯(cuò)誤。
1.具有副作用的功能
由于Python不是像Haskell這樣的純函數(shù)式語(yǔ)言,因此會(huì)產(chǎn)生副作用。 嚴(yán)格來(lái)說(shuō),這不是一個(gè)錯(cuò)誤,但是很容易無(wú)意間手忙腳亂。 下面的示例演示了該問題。
在Python中,對(duì)象是引用類型。 因此,當(dāng)您將列表作為參數(shù)傳遞時(shí),將傳遞引用而不是值。 這意味著,如果您在函數(shù)中更改它們,則更改將反映在外部。
這可能會(huì)導(dǎo)致一些非常令人討厭的意外情況和浪費(fèi)我們的時(shí)間去調(diào)試。 請(qǐng)及時(shí)提防這些錯(cuò)誤,減少麻煩。
2.默認(rèn)參數(shù)中的函數(shù)調(diào)用
默認(rèn)參數(shù)有時(shí)很難使用。 看一下以下內(nèi)容。
為什么每次調(diào)用的返回值都一樣? 原因是在定義函數(shù)時(shí),Python會(huì)在默認(rèn)參數(shù)中計(jì)算表達(dá)式。 如果要?jiǎng)討B(tài)生成默認(rèn)參數(shù),則可以執(zhí)行以下操作。
3.可變的默認(rèn)參數(shù)
此問題是以上兩個(gè)的結(jié)合。 您是否遇到過以下情況?
這里發(fā)生兩件事。
1.定義函數(shù)后,Python會(huì)對(duì)表達(dá)式[[]求值。 (這相當(dāng)于調(diào)用list()。)
該對(duì)象的引用綁定到參數(shù)。 因此,無(wú)論何時(shí)調(diào)用該函數(shù),都將使用相同的對(duì)象。
2.因此,使用可變對(duì)象作為默認(rèn)參數(shù)不是一個(gè)好主意。 你絕對(duì)不應(yīng)該那樣做。
4. 參考覆蓋
如我們所見,每個(gè)對(duì)象都是Python中的引用類型。 除了將它們傳遞給函數(shù)之外,這還可能引起一些混亂。 請(qǐng)參見以下示例:
當(dāng)執(zhí)行b = a時(shí),實(shí)際上存儲(chǔ)了a的引用。 因此,a和b指向同一對(duì)象。 要解決此問題,您應(yīng)該使用內(nèi)置的Deepcopy功能。 這將所有值類型的屬性遞歸復(fù)制到新變量中。
如果使用整數(shù)而不是list嘗試相同的操作,則所有操作的行為都將與您期望的一樣。 原因是整數(shù)類型是不可變的,因此在更改它們時(shí)會(huì)覆蓋引用。
5.從東西導(dǎo)入*
我知道,我們都做到了這一點(diǎn)。 這有幾個(gè)缺點(diǎn)。
首先,不同名稱空間中的函數(shù)可以具有相同的名稱,從而導(dǎo)致整個(gè)代碼庫(kù)混亂。
其次,當(dāng)您在Python中導(dǎo)入模塊時(shí),該模塊中的所有代碼都將被執(zhí)行。 如果有很多子模塊要導(dǎo)入,這會(huì)大大降低速度。 因此,如果僅導(dǎo)入NumPy以生成隨機(jī)數(shù),則最好使用下面方法:
than
6.使用字符串串聯(lián)連接路徑
假設(shè)您必須從變量data_folder給定的文件夾中打開一個(gè)名為data.csv的文件。 應(yīng)該如何確定文件路徑? 如果你在做:
那你做錯(cuò)了。 例如,這在Windows上將不起作用。 您可能沒有經(jīng)驗(yàn),但是使用不同開發(fā)設(shè)置的你的同事肯定會(huì)感到痛苦。
為了解決這個(gè)問題,您應(yīng)該使用Python的內(nèi)置工具pathlib或簡(jiǎn)單地使用os.path.join函數(shù):
7. 測(cè)試覆蓋率低
這是一個(gè)高水平的問題。 尤其是當(dāng)您是初學(xué)者時(shí),單元測(cè)試的好處尚不清楚。 但是,每個(gè)經(jīng)驗(yàn)豐富的開發(fā)人員都可以告訴您,這是絕對(duì)必要的。 使用未經(jīng)測(cè)試的代碼就像打個(gè)模子:修復(fù)一個(gè)錯(cuò)誤,引入另一個(gè)錯(cuò)誤。
為了避免這些錯(cuò)誤,從項(xiàng)目的開始就應(yīng)該注意。 添加功能(甚至功能)后,應(yīng)立即編寫測(cè)試用例以驗(yàn)證能否跑通。 有很多很棒的庫(kù),例如內(nèi)置的unittest或非常流行的pytest。
應(yīng)該認(rèn)真投入時(shí)間來(lái)測(cè)試您的代碼。 這樣做可能需要一些時(shí)間,但這是一項(xiàng)長(zhǎng)期投資。 您將節(jié)省更多的調(diào)試時(shí)間。
簡(jiǎn)而言之,這是您在Python中可能犯的七個(gè)最痛苦的錯(cuò)誤。 在追求Python熟練度的過程中,您肯定還會(huì)遇到更多。 但是,有了本指南,您將有知識(shí)來(lái)避免這些出現(xiàn)最頻繁的錯(cuò)誤。
-
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93686 -
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84628
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論