本篇將總結實際項目開發(fā)中Python代碼規(guī)范檢查、自動編排的一些工具,特點,使用方法,以及如何在Pycharm中集成這些工具,如autoflake、yapf、black、isort、autopep8代碼規(guī)范和自動編排工具。上一篇總結的pylint、pyproject-flake8、pyflakes、flake8、mypy代碼規(guī)范掃描工具參考:
https://blog.csdn.net/zhouruifu2015/article/details/129876922https://blog.csdn.net/zhouruifu2015/article/details/129876922
autoflake
介紹
autoflake 可以從 Python 代碼中刪除未使用的導入和變量,以及無用的pass語句,以此精簡你的代碼。默認情況下,autoflake僅刪除標準庫中未使用的模塊的導入,其他模塊可能有副作用,所以禁止了自動刪除,可以使用--imports 選項指定其他模塊要刪除未使用的導入:
autoflake --imports=django,requests,urllib3 <文件名>
要刪除所有未使用的導入(無論它們是否來自標準庫),可以使用 --remove-all-unused-imports 選項。
默認情況下,autoflake 禁用了刪除未使用的變量,要刪除未使用的變量,可以使用 --remove-unused-variables 選項。
安裝&配置
安裝:pip install --upgrade autoflake
使用
可選參數列表:
- -h, --help 顯示幫助信息并退出
- -c, --check 如果需要更改則返回錯誤代碼
- -i, --in-place 直接移除更改文件而不是打印差異
- -r, --recursive 遞歸目錄
- --exclude 排除匹配文件/目錄
- --imports 指定要刪除未引用導入的模塊
- --expand-star-imports 使用未定義名稱擴展星號通配符導入,僅在只有一顆星導入時觸發(fā)文件,如果文件中有 `__all__` 或 `del` 則跳過
- --remove-all-unused-imports 刪除所有未使用的導入(不僅僅是那些來自標準庫)
- --ignore-init-module-imports 排除 __init__.py
- --remove-duplicate-keys 刪除對象中的所有重復鍵
- --remove-unused-variables 刪除未使用的變量
- --version 顯示程序的版本號并退出
如果想忽略某些行的導入移除,可以使用 # noqa 注釋
from .endpoints import role , token, user, utils?? # noqa
命令行中使用
直接整改文件:autoflake --in-place --remove-unused-variables example.py
輸出檢查結果不整改文件:autoflake autopep8_test.py
yapf
介紹
Yapf?是另一種有自己的配置項列表的重新格式化代碼的工具。它與 Autopep8 的不同之處在于它不僅會指出代碼中違反 PEP 8 規(guī)范的地方,還會對沒有違反 PEP 8 但代碼風格不一致的地方重新格式化,旨在令代碼的可讀性更強。
由Google開發(fā)維護的格式化工具,目的是讓代碼更漂亮;它支持很多的自定義選項,適合對自己的代碼有特殊格式需求的場景;
yapf并不支持對import進行排序,所以需要使用isort工具。
安裝&配置
執(zhí)行?pip install yapf
?安裝 Yapf
- 可以yapf的格式化配置文件
[yapf]
based_on_style = pep8
spaces_before_comment = 4
split_before_logical_operator = true
based_on_style可以是前面的四種預設格式之一。
yapf有默認的查找格式化配置文件的策略,可以使用參數--no-local-style禁用搜索;查找策略的細節(jié)可以查看官方README。
- 可以是JSON格式的配置字符串
--style='{based_on_style: pep8, indent_width: 4}'
更多的配置選項可以使用命令yapf --style-help查看,或者查看官方文檔:https://github.com/google/yapf#id11。
格式選項并不區(qū)分大小寫。
使用
執(zhí)行?yapf [options] path/to/dir
?或?yapf [options] path/to/module.py
?可以對代碼重新格式化。
yapf命令行參數及格式化選項,yapf命令行工具的參數并不是很多,主要常用的有下面幾個:
- -d, --diff:打印格式化前后差異
- -i, --in-place:原地格式化原文件
- -l START-END, --lines START-END:格式化指定行范圍
- --style STYLE:指定格式化標準
其中--style最為常用,用于指定格式化的標準和自定義選項。可以是一些預設的選項,包括:
- pep8(默認值)
- google(基于Google Python Style Guide)
- yapf(用于Google開源項目的代碼風格)
格式化代碼
yapf支持遞歸處理目錄,使用-r參數可以遍歷目錄及其子目錄,使用-e PATTERN或者--exclude PATTERN排除特定文件,比如:
yapf --style=pep8 -r -i --exclude "*_test.py" src/py
格式化代碼之后,再使用isort進行imports的排序(當然,也可以先排序imports):
isort --fss --skip-glob "*_test.py" src/py
檢查代碼是否符合規(guī)范
檢查代碼是否符合規(guī)范,可以將yapf的-i參數替換為-d,如果存在不符合規(guī)范的內容,則打印出來,并且返回非0,比如:
yapf --style=pep8 -r -d --exclude "*_test.py" src/py
要檢查imports是否符合規(guī)范,給isort添加-c, --check-only, --check參數即可,不符合規(guī)范將會報錯,并返回非零值:
isort -c --fss --skip-glob "*_test.py" src/py
如此便可以在自動化檢查的時候通過判斷返回值是否為0,確定代碼是否符合規(guī)范,從而可以在自動化構建的pipeline中提前結束,提示開發(fā)者重新格式化代碼。
參考文檔
https://github.com/google/yapf
https://github.com/google/yapf#usage
black
Black?在代碼檢查工具當中算是比較新的一個。它與 Autopep8 和 Yapf 類似,但限制較多,沒有太多的自定義選項。這樣的好處是不需要去決定使用怎么樣的代碼風格,讓Black來做決定就好??梢栽谶@里查閱 Black?有限的自定義選項以及如何在配置文件中對其進行設置。
Black依賴于Python 3.6+,但它可以格式化用Python 2編寫的代碼。
Black配置選項很少,避免因為配置選項太多反而導致格式規(guī)范不一致。
介紹
安裝&配置
執(zhí)行?pip install black
?安裝 Black
使用
執(zhí)行?black path/to/dir
?或?black path/to/module.py
?就可以使用 Black 優(yōu)化代碼。
參考文檔
- https://en.wikipedia.org/wiki/Lint_(software)
- GitHub - psf/black: The uncompromising Python code formatter
isort
介紹
Isort?這個庫能將項目中導入的庫按字母順序排序,并將其正確劃分為不同部分(例如標準庫、第三方庫、自建的庫等)。這樣提高了代碼的可讀性,并且可以在導入的庫較多的時候輕松找到各個庫。
文檔中還提供了更多的配置項,例如通過配置?.isort.cfg
?文件來決定 isort 如何處理一個庫的多行導入。
和 Flake8、Pylint 一樣,isort 也提供了將其與流行的編輯器和 IDE?集成的插件。
安裝&配置
安裝:pip install isort
Pycharm中配置isort
使用
執(zhí)行?isort path/to/module.py
?就可以運行了。
isort命令行參數和格式化選項
isort常用的命令行參數有:
-d, --stdout:輸出到標準輸出,不修改文件
-c, --check-only, --check:僅檢查imports是否符合規(guī)范
--df, --diff:打印執(zhí)行格式化前后的差異,而不修改文件
--profile PROFILE:基礎配置選項,可選擇black,?django,?pycharm,?google,?open_stack等常用風格。
--fss, --force-sort-within-sections:嚴格按照包名進行排序,而不管是直接使用import還是使用from ... import ...。
命令行中對單個文件轉換
編寫測試代碼
執(zhí)行后的效果,可以看出isort并沒有把引入但未使用的os做移除
Pycharm中執(zhí)行轉換
對單個文件進行轉換
對整個項目進行轉換
參考文檔
- Options:https://pycqa.github.io/isort/docs/configuration/options.html
- Profiles:https://pycqa.github.io/isort/docs/configuration/profiles.html
- https://github.com/PyCQA/isort
- https://github.com/PyCQA/isort/wiki/isort-Plugins
autopep8
介紹
A tool that automatically formats Python code to conform to the PEP8 style guide.
Autopep8?是一個開源的命令行工具,它能夠將Python代碼自動格式化為PEP8風格(如重新縮進行、修復縮進、刪除多余的空格),并重構常見的比較錯誤(例如布爾值和?None
?值),可以查看文檔中完整的更正列表。
Autopep8使用pycodestyle工具來決定代碼中的哪部分需要被格式化,這能夠修復大部分pycodestyle工具中報告的排版問題。
安裝&配置
安裝pip install autopep8
或
- Pycharm配置外置工具
Program:????????????????? D:\env36_tornado\Scripts\autopep8.exe
Arguments:?????????????? --in-place --aggressive --aggressive $FilePath$
Working directory:???? $ProjectFileDir$
Output filters:??????????? $FILE_PATH$\:$LINE$\:$COLUMN$\:.*
- 如果Arguments僅僅配置成 $FilePath$ 則發(fā)現(xiàn)有不符合規(guī)范的文件,僅僅輸出結果。
- Arguments配置成 --in-place --aggressive --aggressive $FilePath$ 發(fā)現(xiàn)有不符合規(guī)范的文件,則會自動進行整改。
使用
--in-place類似于sed命令的-i選項,如果不包含–in-place選項,則會將autopep8格式化以后的代碼直接輸出到控制臺??梢允褂眠@種方式檢查autopep8的修改,使用–in-place則會直接將結果保存到源文件中,將不會有任何輸出,autopep8會直接修改源文件。
autopep8還存在--aggressive選項,這會執(zhí)行更多實質性地更改,可以多次使用--aggressive,以達到更佳的效果。
- 命令行中針對單個指定文件
autopep8.exe --in-place --aggressive --aggressive <filename>
autopep8 --in-place --aggressive --aggressive autopep8.py
autopep8 --in-place --aggressive --aggressive?
就可以重新格式化你的代碼。aggressive
?選項的數量表示 Auotopep8 在代碼風格控制上有多少控制權。在這里可以詳細了解?aggressive?選項。
- Pycharm中執(zhí)行格式化
Pycharm編輯區(qū)域右擊中選擇autopep8
或
格式化后的效果,庫的排列順序還是沒有做排序,以及引用但未使用的os庫也沒有去掉,可以考慮使用isort再次進行整改。
autopep8對目錄進行掃描報:[Errno 13] Permission denied
Autopep8可以通過指定目錄來對多個文件進行掃描和格式化??梢允褂靡韵旅罡袷剑?/p>
```bash
autopep8 --recursive <directory_path_or_file_path>
```
其中,`--recursive`選項指定進行遞歸操作,掃描目錄下的所有子目錄和文件。 `directory_path_or_file_path`指定目錄路徑或單個文件路徑。
上述命令,進入項目目錄執(zhí)行:autopep8 --recursive? --in-place --aggressive --aggressive .
如果Linux上還遇到[Errno 13] Permission denied錯誤,則可能是因為沒有足夠的權限訪問某些文件或目錄??梢試L試在命令前加上`sudo`作為管理員身份運行命令,或者將文件或目錄權限更改為可讀寫權限。
如果是Windows,則設置如下:
參考文檔
GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.A tool that automatically formats Python code to conform to the PEP 8 style guide. - GitHub - hhatto/autopep8: A tool that automatically formats Python code to conform to the PEP 8 style guide.https://github.com/hhatto/autopep8
文章來源:http://www.zghlxwxcb.cn/news/detail-408383.html
?輸入才有輸出,吸收才能吐納?!a字不易文章來源地址http://www.zghlxwxcb.cn/news/detail-408383.html
到了這里,關于Python代碼規(guī)范:企業(yè)級代碼靜態(tài)掃描-代碼規(guī)范、邏輯、語法、安全檢查,以及代碼規(guī)范自動編排(2)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!