PEP8編碼規範是一種非常優秀的編碼規範,也得到了Python程式員的普遍認可,如果實踐中或者項目中沒有統一的編碼規範,建議儘量遵循PEP8編碼規範,當然如果項目中已經有了自身的編碼規範,應當優先遵循自身的編碼規範,哪怕原先的代碼風格在你看來很糟糕,也要儘量與源代碼風格保持一致。原文地址:https ...
PEP8編碼規範是一種非常優秀的編碼規範,也得到了Python程式員的普遍認可,如果實踐中或者項目中沒有統一的編碼規範,建議儘量遵循PEP8編碼規範,當然如果項目中已經有了自身的編碼規範,應當優先遵循自身的編碼規範,哪怕原先的代碼風格在你看來很糟糕,也要儘量與源代碼風格保持一致。
原文地址:https://blog.csdn.net/ratsniper/article/details/78954852,原文很詳細,有代碼示例和更多講解,如果有足夠時間,建議閱讀原文,這篇筆記只是根據此文來整理了一些常用的點。
一、縮進和對齊
1.語法縮進:語法上的縮進使用4個空格(參數對齊等不一定要用4個空格),不要混用製表符與空格,Python2程式在命令行運行時,使用-t可以發出製表符與空格混用的警告,而使用-tt就會使這些警告變成錯誤提示了
2.行寬:代碼行寬限制在79個字元(也可以是99個字元),文檔和註釋限制在72個字元
3.對齊:當圓括弧、方括弧和花括弧中的元素需要換行時,元素應該垂直對齊,而且如果下一條語句需要縮進時,比如if的條件語句和要執行的代碼塊,這些換行的元素應該使用更多的縮進來區分下麵的縮進
4.換行:代碼換行時應該優先使用圓括弧、方括弧和花括弧中的隱式續行,視情況使用反斜杠\來進行換行
5.二元運算符:在二元雲演算法的換行時推薦以二元運算符作為新行的開始
6.多條語句同行:即使是簡單的語句,即使可以使用分號,但是不推薦寫在同一行,比如再簡單的if/for/while語句也應該分行寫
二、空行
1.頂級定義:頂級函數和類定義的前後使用兩個空行隔開
2.類方法:類中方法的定義使用一個空行隔開
3.邏輯分段:函數中的功能組和邏輯段使用空行來隔開(視情況靈活運用)
三、import語句
1.import *和from xxx import *:這種通配符星號的用法應該儘量避免使用
2.import xxx:這種語句有多個時,應該分開導入,不推薦使用import xxx, yyy
3.from xxx import x, xx:這種形式可以一次導入多個而不用分行
4.普通導入:導入應該在文檔字元串和註釋之後,在全局變數和常量定義之前
5.導入順序:導入順序應該是標準庫,三方庫,以及本地模塊,且需要加空行分隔
6.導入路徑:導入應該儘量使用絕對路徑,或使用顯式的相對路徑也是可行的(如:from . import xxx),儘量避免隱式的相對路徑
7.雙下劃線變數導入:在像__version__、__author__等模塊級變數的導入應該在文檔和註釋之後,在import語句之前
四、空格
1.括弧等之後的空格:避免緊跟在括弧、中括弧和大括弧之後的空格,例如:func( list_[ 1 ], { 'age': 18 })。應該省去不必要的空格func(list_[1], {'age': 18})
2.逗號等之前的空格:避免緊跟在逗號、分號和冒號之前的空格,例如:a , b = b , a。應該省去不必要的空格a, b = b, a
3.切片中的空格:切片的冒號左右兩邊應該有相同的空格,切片的下標如果是數字或變數,建議冒號兩邊不用空格,如果下標是多個變數的表達式或者函數表達式,則建議冒號兩邊使用一個空格分隔
4.行尾的空格:避免在行尾添加空格,比如在換行符反斜杠\後有空格的話,那這個反斜杠\就不是換行符了,因為行尾是空格而不是反斜杠\
5.二元運算符:除了函數傳參和函數指定預設值等特殊情況外,應該總是在二元運算符的兩邊添加一個空格,如果一個表達式有多個二元運算符(如:+-*/),那麼高優先順序的二元運算符兩邊不用空格,低優先順序兩邊添加一個空格,如:x = a*b + c/d
五、註釋
1.修改註釋:修改代碼時一定修改對應的註釋,千萬不要留下與代碼不對應的,甚至是錯誤的註釋,視情況甚至可以刪掉註釋也不留錯誤的註釋
2.行註釋:使用一個#和一個空格開始,並且與註釋的代碼具有相同縮進,如果需要使用行註釋寫多段意思的註釋,可以使用一個空行註釋(即這一行只有一個#)來分隔不同意思的段落
3.代碼行之後的註釋:應該與前面的代碼間隔至少兩個空格,然後也是以使用一個#和一個空格開始,但是這種註釋應該儘量少用,不必要的話就不用
4.文檔註釋:應該為所有公共的模塊、函數、類和方法編寫文檔註釋,一般使用三個雙引號寫文檔註釋,且如果是單行註釋,則結尾的三引號應該與註釋內容同行,如果是多行註釋,則結尾三引號應該單獨一行
六、命名
1.舊代碼:如果原有的代碼與命名規範不一樣,應該與原有代碼保持一致
2.API:暴露的API或者給別人使用的API應該以使用場景來命名,而不是實現原理命名
3.首字母大寫加下劃線:這種命名風格不可取,比如Capitalized_Words_With_Underscores
4.單下劃線開頭:這種命名為弱“內部使用”指示器,即模塊內非公有(“protected”),比如在使用from xxx import *語句時是是不會導入單下劃線開頭的對象的
5.單下劃線結尾:這種命名風格是為了避免與Python內部關鍵字衝突的一種約定
6.雙下劃線開頭:當在類中以雙下劃線開頭定義時,調用它的時候會在前面加上“_ClassName”,如調用類A中的屬性__a時,__a就變成了_A__a,這樣子類就不可以隨便調用這個屬性了,可以認為它是“私有”的,但Python中沒有“私有”的說法,因為依然可以通過A._A__a去訪問屬性
7.雙下劃線開頭和結尾:為模塊和系統級變數,比如__name__、__init__等,我們自己應該永遠避免使用這種命名風格
8.單字元變數:永遠要使用O(大寫的O)、l(小寫的L)和I(大寫的I),因為有些字體中無法區分它們是數字0和1還是英文字母L和O
9.包名和模板名:使用簡短全小寫的名稱,包名不建議使用下劃線,模塊名為了提高可讀性可以使用下劃線
10.c/c++擴展模塊:使用c/c++編寫的擴展模塊需要在模塊名稱加一個下劃線首碼,如:_socket
11.類名:首字母大寫
12.異常名:異常一般也是類,所以首字母也是大寫,如果異常確實是一個錯誤,那需要在類名後加上“Error”尾碼
13.函數名:全小寫,為了提高可讀性也可以使用下劃線,大小寫混合的情況只限於為了與原來的代碼相容的情況
14.全局變數:只在模塊內使用的全局變數和普通變數一樣定義,但是需要註意使用“from xxx import *”的xxx模塊中的全局變數應該使用單下劃線開頭防止內部介面或變數的對外暴露
15.實例變數:非公有方法和實例變數使用單下劃線開頭(“protected”),雙下劃線開頭會觸發Python的命名轉換規則(在前面加上“_ClassName”)以避免和子類命名的衝突
16.常量:常量通常是模塊級的,使用全大寫和下劃線配合
七、編程建議
1.字元(串)連接:儘量避免使用如str1 += str2或str1 = str1 + str2的方式連接字元(串),建議使用字元串方法join()方法來連接字元(串)
2.單例對象判斷:在於如None這樣的單例對象進行判斷時,應該使用is None或者is not None來進行判斷
3.自定義異常:自定義異常應該繼承自Exception,而不是BaseException
4.try/except:在try中只填充可能出錯的代碼,不要一股腦把全部代碼放進去
5.return語句:除非函數中沒有return語句,如果函數中有return語句,那麼在其他可能結束的情況也顯示的使用return語句,如果其他情況確實沒有值要返回(如運行到了函數結束處,卻不需要返回任何值),也要使用return None顯示指明
6.startswith/endswith:判斷字元串開頭首碼或結尾尾碼時,使用字元串本身的startswith/endswith,不用字元串的切割來進行判斷
7.對象類型的比較:對象類型的比較使用isinstance,而不是type
8.“空”值判斷:對於空字元串、空列表、空字典等的判斷,直接使用本身來進行布爾值判斷,如空字元串使用if str1: pass,而不是if str1 == '': pass