Python代碼風格:寫出漂亮的Python代碼

無規則無以成方圓,美自有其定義。
Python PEP8定義了良好的編碼規範指南,加上Google Python開源代碼編碼規範,遵循這些規範足以寫出足夠漂亮的Python代碼。並且有相當多的輔助工具,實乃天時地利,如果開發中大家共同遵守,也就實現了人和。

爲什麼需要有編碼規範?因爲這很酷。

良好的編碼規範可以讓代碼可讀性更高,易於維護,減少犯錯,漂亮的代碼賞心悅目,也是工程師的名片,有時候從編碼風格上便可高下立判。

本文主要介紹核心的風格準則,基本思路爲:

  1. 把握核心準則
  2. 注意細節
  3. 不確定就查看文檔(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

導入應該按照以下順序分組:

  1. 標準庫導入
  2. 相關的第三方導入
  3. 特定的本地應用/庫導入
    在每個導入組之間放一行空行。
    推薦絕對導入,因爲它們更易讀;處理複雜包佈局時明確的相對導入可以用來替代絕對導入,因絕對導入過於冗長。

此外,根據實踐經驗,建議移除所有不必要的imports。

其他如有細節問題,查看文檔

導入這部分,通過Python庫isort可以完美解決(vscode默認使用isort),在前面介紹vscode配置Python開發環境的文章中有提及:
vscode進階:Python開發環境配置

vscode中isort的默認參數便完全符合上面的編碼規範,這裏介紹筆者一些個人的風格設置,通過設置isort的參數可以實現:

  1. from .. import ...超過行長度限制時,重新起一行:--sl/--force-single-line-imports
  2. 強制通過包名排序:--fss/--force-sort-within-sections

並可設置爲保存時自動排序imports,在vscode中配置爲:

{
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    },
    "python.sortImports.args": [
        "--force-sort-within-sections",
        "--force-single-line-imports"
    ],
}

4 註釋

切忌註釋和代碼不一致!!,這比沒有註釋更讓人抓狂。
主要遵守以下要點:

  1. 修改代碼時,優先修改註釋;
  2. 註釋應該是完整的句子。所以第一個單詞首字母必須大寫,除非是第一個單詞是小寫字母開頭的標識符;
  3. 短註釋可以不加句號結尾,完整句子的註釋必須要句號結尾;
  4. 註釋每行以一個#加一個空格開頭;
  5. 塊註釋需要使用相同級別的縮進;
  6. 行內註釋則必須用至少兩個空格和代碼隔開;
  7. 儘量讓你的代碼“會說話”,不寫不必要的註釋。

5 文檔字符串(a.k.a. "docstrings")

爲所有公共模塊,函數,類和方法書寫文檔字符串。細節可以查看PEP 257。

對於docstrings,CLion有很好的支持,vscode可以通過插件實現Python Docstring Generator

  1. 插件管理器搜索Python Docstring Generator安裝即可
  2. 使用方法很簡單,在函數名後換行快捷鍵Ctrl+Shift+2即可,或者輸入"""敲換行時也會自動添加

該插件默認使用的風格是Google,通過對比一些開源算法庫的文檔,使用Google風格的比如TensorFlowPyTorch,其文檔的可讀性並不如使用numpy風格的NumPySciPy,因此建議使用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 字符串引號

雙引號和單引號是一致的,但是最好遵循一種風格,筆者習慣於使用單引號,因爲:

  1. 寫代碼的時候不需要按住Shift鍵,提高效率
  2. 有的語言字符串必須要使用雙引號,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開發環境配置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章