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