無規則無以成方圓,美自有其定義。
Python PEP8定義了良好的編碼規範指南,加上Google Python開源代碼編碼規範,遵循這些規範足以寫出足夠漂亮的Python代碼。並且有相當多的輔助工具,實乃天時地利,如果開發中大家共同遵守,也就實現了人和。
爲什麼需要有編碼規範?因爲這很酷。
良好的編碼規範可以讓代碼可讀性更高,易於維護,減少犯錯,漂亮的代碼賞心悅目,也是工程師的名片,有時候從編碼風格上便可高下立判。
本文主要介紹核心的風格準則,基本思路爲:
- 把握核心準則
- 注意細節
- 不確定就查看文檔(When in doubt, use your best judgment. Look at other examples and decide what looks best. And don't hesitate to ask!)
一 核心準則
1 縮進
首選使用4個空格。
目前幾乎所有的IDE都是默認tab轉爲4個空格,沒有大問題。
2 行的最大長度
79個字符。
曾經筆者認爲這是個“過時”的建議,目前做開發基本都是大屏幕,寫代碼全屏的時候編輯器足以容納120字符一行或者更長。但是如果要在web上比較兩次提交的代碼差異,顯然是會導致代碼換行,或者如果左右滑動,增加了比較的難度,在多年實踐之後(2016-2020),所以目前還是使用建議的最大行長度。
3 導入
導入位於文件頂部,在文件註釋之後。
導入通常是單獨一行。
# Correct:
import os
import sys
# Wrong:
import sys, os
或者這樣也是可以的:
# Correct:
from subprocess import Popen, PIPE
導入應該按照以下順序分組:
- 標準庫導入
- 相關的第三方導入
- 特定的本地應用/庫導入
在每個導入組之間放一行空行。
推薦絕對導入,因爲它們更易讀;處理複雜包佈局時明確的相對導入可以用來替代絕對導入,因絕對導入過於冗長。
此外,根據實踐經驗,建議移除所有不必要的imports。
其他如有細節問題,查看文檔
導入這部分,通過Python庫isort
可以完美解決(vscode默認使用isort
),在前面介紹vscode配置Python開發環境的文章中有提及:
vscode進階:Python開發環境配置
vscode中isort
的默認參數便完全符合上面的編碼規範,這裏介紹筆者一些個人的風格設置,通過設置isort
的參數可以實現:
- 當
from .. import ...
超過行長度限制時,重新起一行:--sl/--force-single-line-imports
- 強制通過包名排序:
--fss/--force-sort-within-sections
並可設置爲保存時自動排序imports,在vscode中配置爲:
{
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"python.sortImports.args": [
"--force-sort-within-sections",
"--force-single-line-imports"
],
}
4 註釋
切忌註釋和代碼不一致!!,這比沒有註釋更讓人抓狂。
主要遵守以下要點:
- 修改代碼時,優先修改註釋;
- 註釋應該是完整的句子。所以第一個單詞首字母必須大寫,除非是第一個單詞是小寫字母開頭的標識符;
- 短註釋可以不加句號結尾,完整句子的註釋必須要句號結尾;
- 註釋每行以一個#加一個空格開頭;
- 塊註釋需要使用相同級別的縮進;
- 行內註釋則必須用至少兩個空格和代碼隔開;
- 儘量讓你的代碼“會說話”,不寫不必要的註釋。
5 文檔字符串(a.k.a. "docstrings")
爲所有公共模塊,函數,類和方法書寫文檔字符串。細節可以查看PEP 257。
對於docstrings,CLion有很好的支持,vscode可以通過插件實現Python Docstring Generator:
- 插件管理器搜索
Python Docstring Generator
安裝即可 - 使用方法很簡單,在函數名後換行快捷鍵
Ctrl+Shift+2
即可,或者輸入"""
敲換行時也會自動添加
該插件默認使用的風格是Google
,通過對比一些開源算法庫的文檔,使用Google
風格的比如TensorFlow
,PyTorch
,其文檔的可讀性並不如使用numpy
風格的NumPy
和SciPy
,因此建議使用numpy
風格。
將vscode的設置修改如下即可:
{
"autoDocstring.docstringFormat": "numpy",
}
具體numpy
風格何如,參見官方文檔numpydoc docstring guide即可。
6 命名規範
切忌使用毫無含義或者含義不明!!的變量名。
主要的命名規則如下:
元素 | 命名風格 | 示例 |
---|---|---|
包名 | 全小寫,可加下劃線增強可讀性 | sklearn |
模塊名 | 全小寫,避免下劃線 | scipy.signal |
類名/類型變量名稱 | 大駝峯法 | RealCoolEngineer |
常量/枚舉成員 | 全大寫加下劃線 | REAL_COOL_ENGINEER |
函數名 | 全小寫加下劃線(snake case) | follow_real_cool_engineer |
方法名和實例變量(統稱屬性) | 全小寫加下劃線,私有屬性添加一個前導下劃線 | Foo.nickname,Foo._name |
二 注重細節
通過使用Python代碼格式化工具yapf
可以自動解決部分細節的格式問題,結合isort
可以實現完全通過腳本完成Python代碼的格式化或者格式檢查。
或者配置IDE在編輯保存時自動執行代碼格式化,這都是良好的實踐。
1 代碼換行
換行應該在二元操作符前面
# Correct:
# easy to match operators with operands
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
2 空行
頂級函數和類的定義之間有兩行空行。
類內部的函數定義之間有一行空行。
3 字符串引號
雙引號和單引號是一致的,但是最好遵循一種風格,筆者習慣於使用單引號,因爲:
- 寫代碼的時候不需要按住Shift鍵,提高效率
- 有的語言字符串必須要使用雙引號,Python處理時不需要再加反斜槓轉義
4 空格
添加必要的空格,但是避免多餘空格。
始終避免行末空白,包括一切不可見字符。
因此,如果IDE支持顯示所有不可見字符, 那麼請開啓它!
同時,如果IDE支持刪除行末空白內容,那麼也請開啓它!
這一部分yapf
可以幫助我們解決,只需要寫完代碼格式化一下即可。
5 複合語句
不建議一行包含多條語句。
6 尾部逗號
當列表元素、參數、導入項未來可能不斷增加時,留一個尾部逗號是一個很好的選擇。
通常的用法是每個元素獨佔一行,尾部均有逗號,在最後一個元素的下一行寫閉標籤。
如果是所有元素在同一行,就沒有必要這麼做了。
# Correct:
FILES = [
'setup.cfg',
'tox.ini',
]
initialize(FILES,
error=True,
)
# Wrong:
FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)
7 修正linter檢測到的問題
使用flake8
對Python代碼進行檢查,除非有充足理由,否則修改所有檢查到的Error和Warning。
遵循以上準則,藉助相關的工具,寫出很酷很漂亮的Python代碼自然是水到渠成的事了。
除了#Python系列文章,也歡迎持續關注#高效使用IDE系列文章。
合適的語言,搭配合適的IDE,才能讓你的智慧更高效地發揮威力哦。
三 相關文檔
如果沒有閱讀過筆者關於vscode下配置Python開發環境的文章,強烈建議前往閱讀:
vscode進階:Python開發環境配置