使用PyLint分析評(píng)估代碼質(zhì)量
什么是PyLint
PyLint是一款用于評(píng)估Python代碼質(zhì)量的分析工具,它誕生于2003年,其最初十年的主要作者和維護(hù)者是Sylvain Thénault。PyLint可以用來檢查代碼是否錯(cuò)誤、是否符合編碼規(guī)范(它默認(rèn)使用的編碼規(guī)范是PEP 8),在分析代碼后PyLint將會(huì)輸出一段信息,內(nèi)容包括在代碼中檢查到的警告和錯(cuò)誤,如果運(yùn)行兩次,它將會(huì)輸出兩次的統(tǒng)計(jì)信息,以便使用者分析代碼是否得到改進(jìn)。PyLint的特性是報(bào)告盡可能少的錯(cuò)誤,但是它會(huì)輸出非常多的警告信息,所以建議在程序提交之前或者想要整理代碼時(shí)使用PyLint,這樣可以忽略掉大量的無效警告。
自PyLint 1.4起,PyLint只支持Python 2.7+和Python 3.3+。
安裝PyLint
在命令行界面執(zhí)行如下代碼,即可安裝PyLint:
pip install pylint
在命令行界面執(zhí)行如下代碼,即可查詢PyLint的安裝路徑:
where pylint
調(diào)用PyLint
在命令行中調(diào)用
分析Python包或者Python模塊
pylint [options] module_or_package
分析Python文件
pylint [options] my_module.py
并行分析Python文件
pylint -j 4 my_module_1.py my_module_2.py my_module_3.py my_module_4.py
上述語句將產(chǎn)生4個(gè)并行的PyLint子進(jìn)程來對(duì)所需的四個(gè)文件并行檢查,PyLint發(fā)現(xiàn)問題后不會(huì)立即顯示,待所有模塊檢查完畢后才會(huì)顯示。其中,參數(shù)-j用于指定所需的PyLint子進(jìn)程數(shù)量,默認(rèn)值為1。
常用的命令行選項(xiàng)
-
--version:顯示PyLint以及Python的版本;
使用示例:
pylint --version -
-h, --help :顯示幫助信息;
使用示例:
示例一: pylint -h 示例二: pylint --help -
-ry:顯示各項(xiàng)信息的報(bào)表統(tǒng)計(jì);
使用示例:
pylint -ry my_module.py -
--generate-rcfile:生成配置信息示例;
使用示例:
## 將persistent修改為n,并將配置信息保存至pylint.conf文件中 pylint --persistent=n --generate-rcfile > pylint.conf -
--rcfile=<file> :指定所使用的的配置文件;
使用示例:
pylint --rcfile=pylint.conf my_module.py -
--persistent=y_or_n:是否使用Pickle存儲(chǔ)上次結(jié)果;
使用示例:
pylint --persistent=y my_nodule.py -
--output-format=<format>:指定輸出格式( parseable, colorized, msvs);
使用示例:
pylint --output-format=parseable my_module.py -
--msg-template=<template>:指定輸出內(nèi)容;
template參數(shù)包括:
- path:文件的相對(duì)路徑;
- abspath:文件的絕對(duì)路徑;
- line:輸出行數(shù);
- column:輸出列數(shù);
- module:模塊名;
- obj : 模塊中的對(duì)象(如果有的話) ;
- msg :信息文本;
- msg_id :信息編號(hào);
- symbol :信息的符號(hào)名稱;
- C:信息類別;
使用示例:
pylint --msg-template='{msg_id}:{line:3d}:{msg}' my_module.py -
--list-msgs:生成pylint的警告列表;
使用示例:
pylint --list-msgs -
--full-documentation : 以reST格式生成pylint的完整文檔。
使用示例:
pylint --full-documentation
在Python程序中調(diào)用PyLint
方法一
from pylint import epylint as lint
lint.py_run("my_module.py --msg-template='{line:3d}:{msg}'")
# 注意,先寫文件名,再寫命令選項(xiàng),文件名和命令選項(xiàng)通過空格隔開。
方法二
from pylint import epylint as lint
(pylint_stdout, pylint_stderr) = lint.py_run('my_module.py', return_std=True)
# 注意,返回值類型為StringIO,可以通過read()方法進(jìn)行讀取。
print(pylint_stdout.read())
關(guān)聯(lián)PyLint與PyCharm
方法一
-
進(jìn)入PyCharm,依次點(diǎn)擊: File -> Settings -> Tools -> External Tools,進(jìn)入下圖頁面;
![步驟1]()
-
點(diǎn)擊加號(hào),在彈窗中填寫下圖紅色方框中的字段后,點(diǎn)擊OK;
- Name參數(shù)可以填寫pylint;
- Program參數(shù)選擇pylint.exe的路徑,選擇后,Working directory參數(shù)將自動(dòng)補(bǔ)全;
- Arguments參數(shù)根據(jù)實(shí)際需求點(diǎn)擊右側(cè)Inser Macros進(jìn)行選擇即可,示例中選擇檢查當(dāng)前路徑下的文件。
![pylint關(guān)聯(lián)pycharm]()
-
依次點(diǎn)擊Tools->External Tools->pylint,即可運(yùn)行PyLint。
方法二
-
進(jìn)入PyCharm,依次點(diǎn)擊: File -> Settings -> Plugins,進(jìn)入下圖頁面;
![步驟2-1]()
-
點(diǎn)擊Browse repositories,進(jìn)入下圖頁面;
![步驟2-2]()
-
在左上角搜索框中搜索pylint,右擊安裝,點(diǎn)擊Yes開始下載,之后點(diǎn)擊Close,重啟PyCharm后即安裝成功;
![步驟2-3]()
-
依次點(diǎn)擊: File -> Settings -> pylint,可根據(jù)實(shí)際需求進(jìn)行配置;
![步驟2-5]()
-
運(yùn)行時(shí),點(diǎn)擊左下角pylint即可查看PyLint輸出,單擊具體輸出內(nèi)容,可跳轉(zhuǎn)到相關(guān)代碼行。
![步驟2-6]()
PyLint忽略部分警告的方法
在具體代碼處添加注釋
使用示例:
from PyQt5.QtWidgets import QApplication # pylint: disable=no-name-in-module
在命令行處傳入?yún)?shù)
使用示例:
pylint --disable=no-name-in-module my_module.py
修改調(diào)用PyLint時(shí)使用的配置文件
打開配置文件,找到disable字段,在字段后面添加要忽略的警告。
使用示例:
disable=raw-checker-failed,
bad-inline-option,
locally-disabled,
file-ignored,
suppressed-message,
useless-suppression,
deprecated-pragma,
use-symbolic-message-instead,
similarities,
no-name-in-module,
no-member,
consider-using-f-string,
anomalous-backslash-in-string,
consider-using-sys-exit
PyLint的輸出
源代碼分析
對(duì)于每個(gè)Python模塊,PyLint的輸出格式如下:
- 第一行將在若干' * '字符后顯示模塊名稱;
- 從第二行起顯示PyLint的輸出,默認(rèn)的輸出內(nèi)容格式為——信息類別:行數(shù):信息內(nèi)容 。
信息類別:
- R:違反重構(gòu)標(biāo)準(zhǔn);
- C:違反編碼規(guī)范;
- W:警告;
- E:錯(cuò)誤;
- F:致命錯(cuò)誤,使PyLint無法進(jìn)一步處理。
PyLint的輸出范例:
************* Module pylint.checkers.format
W: 50: Too long line (86/80)
W:108: Operator not followed by a space
print >>sys.stderr, 'Unable to match %r', line
^
W:141: Too long line (81/80)
W: 74:searchall: Unreachable code
W:171:FormatChecker.process_tokens: Redefining built-in (type)
W:150:FormatChecker.process_tokens: Too many local variables (20/15)
W:150:FormatChecker.process_tokens: Too many branches (13/12)
可以通過pylint --help-msg <msg-id>查詢更多信息,使用示例:
pylint --help-msg C0115
檢查報(bào)告
檢查報(bào)告在源代碼分析的后面,每個(gè)報(bào)告關(guān)注項(xiàng)目的特定方面,比如每種類別的信息數(shù)目,模塊的依賴關(guān)系等等。具體來說,報(bào)告中會(huì)包含如下的方面:
- 檢查的模塊個(gè)數(shù);
- 對(duì)于每個(gè)模塊,其錯(cuò)誤和警告在其中所占的百分比;
- 對(duì)于所有模塊,其錯(cuò)誤和警告的總數(shù)量;
- 文件中帶有文檔字符串的類、函數(shù)和模塊所占的百分比;
- ......
PyLint與PyChecker的區(qū)別
PyLint支持PyChecker提供的大部分功能,他們之間一個(gè)最主要的區(qū)別在于PyLint能夠檢測(cè)編碼標(biāo)準(zhǔn)是否規(guī)范,其次,PyLint不支持導(dǎo)入活動(dòng)模塊而PyChecker可以。
PEP 8標(biāo)準(zhǔn)
代碼布局
-
每個(gè)縮進(jìn)級(jí)別使用4個(gè)空格,連續(xù)行使用垂直對(duì)齊或者使用懸掛式縮進(jìn)(額外的4個(gè)空格縮進(jìn));
-
空格是首選的縮進(jìn)方法;
-
每行最多79個(gè)字符;
-
允許在二元運(yùn)算符前后換行,但代碼需保持一致,對(duì)于新代碼建議在二元運(yùn)算符前進(jìn)行換行;
-
使用兩個(gè)空白行分隔頂層函數(shù)和類定義;
-
類方法定義使用一個(gè)空行分隔;
-
使用額外的空白行來分隔相關(guān)邏輯功能;
-
文件應(yīng)該使用UTF-8編碼,且不應(yīng)該有編碼聲明;
-
導(dǎo)入多個(gè)庫函數(shù)應(yīng)該分開依次導(dǎo)入,導(dǎo)入總是放在文件的頂部,在任何模塊注釋和文檔字符串之后,在模塊全局變量和常量之前;導(dǎo)入應(yīng)按以下順序進(jìn)行:標(biāo)準(zhǔn)庫導(dǎo)入、有關(guān)的第三方庫導(dǎo)入、本地應(yīng)用程序/庫特定的導(dǎo)入,每組導(dǎo)入直接用空行分隔;避免通配符導(dǎo)入(import *)。
字符串
-
單引號(hào)字符串和雙引號(hào)字符串相同,但代碼需保持一致;
-
對(duì)于三引號(hào)字符串,常用三個(gè)雙引號(hào)作文檔字符串,文檔字符串常用在模塊的開端用以說明模塊的基本功能,或緊跟函數(shù)定義的后面用以說明函數(shù)的基本功能。
空格
-
避免使用無關(guān)的空格,包括空格內(nèi)、逗號(hào)分號(hào)前面等;
-
避免在行末使用空格;
-
二元運(yùn)算符在兩側(cè)使用一個(gè)空格;
-
當(dāng)用于指示關(guān)鍵字參數(shù)或默認(rèn)參數(shù)值時(shí),不要在=符號(hào)周圍使用空格。
使用尾部逗號(hào)(trailing commas)
-
尾部逗號(hào)通??蛇x,但對(duì)于只有一個(gè)元素的元組是必選的;
-
當(dāng)參數(shù)、值等列表期望經(jīng)常擴(kuò)展時(shí),通常是每個(gè)值一行,再加上一個(gè)尾部逗號(hào)。
注釋
-
代碼更改時(shí),相應(yīng)的注釋也要隨之更改;
-
注釋應(yīng)該是完整的語句,第一個(gè)單詞應(yīng)該大寫,除非它是特定標(biāo)識(shí)符;
-
塊注釋:縮進(jìn)到與該代碼相同的級(jí)別,塊注釋的每一行都以#和一個(gè)空格開始;
-
行注釋:對(duì)某一語句行進(jìn)行注釋,注釋應(yīng)該與語句至少隔開兩個(gè)空格,用#和一個(gè)空格開始;
-
對(duì)于公共的模塊,功能,類和方法需要為其寫文檔字符串;
-
注釋應(yīng)該是完整的語句,第一個(gè)單詞應(yīng)該大寫,除非它是特定標(biāo)識(shí)符。
命名約定
-
命名應(yīng)該反映其用途而非實(shí)現(xiàn);
-
不要將字符’l’(小寫字母L),’O’(大寫字母O)或’I’(大寫字母I)作為單個(gè)字符變量名稱;
-
模塊名應(yīng)該使用簡(jiǎn)短、全小寫的名字;
-
類的命名采用駝峰命名法,即每個(gè)單詞的首字母大寫;
-
函數(shù)名稱應(yīng)該是小寫的,為了提高可讀性,必須使用由下劃線分隔的單詞。








浙公網(wǎng)安備 33010602011771號(hào)