简介
Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码。
- Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等。
- Pylint 的一个很大的好处是它的高可配置性,高可定制性,并且可以很容易写小插件来添加功能。
- 如果运行两次 Pylint,它会同时显示出当前和上次的运行结果,从而可以看出代码质量是否得到了改进。
- 目前在 eclipse 的 pydev 插件中也集成了 Pylint。
PyLint 官方主页:http://pypi.python.org/pypi/pylint GitHub:https://github.com/pylint-dev/pylint 官方文档:http://pylint.pycqa.org/en/latest/user_guide/output.html pylint:https://pylint.readthedocs.io/en/latest/user_guide/usage/run.html
安装&配置
pip install pylint
Pycharm中设置 Arguments:FilePath
Pycharm中指定配置文件方式
Pycharm中添加参数屏蔽自定类型的检查--disable=W,E,R,C
使用案例
运行 pylint [options] path/to/dir
或者 pylint [options] path/to/module.py
就可以在命令行中使用 Pylint,它会向控制台输出代码中违反规范和出现错误的地方。
运行pylint
在终端中运行pylint命令,指定要检查的Python文件:
pylint your_python_file.py
# 检查单个py文件,指定配置文件,不指定,使用默认配置文件
pylint --rcfile=pylint.conf s1.py
查看检查结果
pylint会对Python代码进行检查,并输出检查结果。检查结果包括代码规范性、错误和潜在问题等方面的提示和建议。
************* Module 704
leetcode/704.py:28:0: C0305: Trailing newlines (trailing-newlines) #文尾有多余的行
leetcode/704.py:1:0: C0114: Missing module docstring (missing-module-docstring) # 脚本首行没有添加注释
leetcode/704.py:4:11: W0621: Redefining name 'nums' from outer scope (line 23) (redefined-outer-name) #变量名字与函数参数名字不能一样
leetcode/704.py:4:28: W0621: Redefining name 'target' from outer scope (line 24) (redefined-outer-name) #变量名字与函数参数名字不能一样
leetcode/704.py:4:0: C0116: Missing function or method docstring (missing-function-docstring) #函数缺少注释,注释要放在函数的第一行而不是def的上面
注意事项 在使用pylint检查Python代码时,需要注意以下事项:
- pylint只是一种工具,不能完全代替人工检查。需要结合实际况和经验进行判断和调整。
- pylint的检查结果是建议性的,不一定是绝对正确的。需要根据实际情况进行判断和调整。
- pylint的检查结果可能会受到一些配置参数的影响,需要根据实际情况进行调整。
命令行参数
pylint -h
或
pylint --help
--generate-rcfile
生成一个配置文件示例;
可以使用重定向把这个配置文件保存下来用做以后使用;
也可以在前面加上其它选项,使这些选项的值被包含在这个产生的配置文件里;
如:“pylint --persistent=n --generate-rcfile > pylint.conf”,查看 pylint.conf,可以看到 persistent=no,而不再是其默认值 yes;
--rcfile=<file>
指定一个配置文件;
把使用的配置放在配置文件中,这样不仅规范了自己代码,也可以方便地和别人共享这些规范;
如:pylint --rcfile=pylint.conf s1.py
使用pylint.conf这个配置文件来对s1.py进行检查
-i <y_or_n>, --include-ids=<y_or_n>
在输出中包含 message 的 id, 然后通过“pylint --help-msg=<msg-id>”来查看这个错误的详细信息,这样可以具体地定位错误。
-r <y_or_n>, --reports=<y_or_n>
表示 Pylint 的输出中是否包含报告部分;
--files-output=<y_or_n>
将每个 module /package 的 message 输出到一个以 pylint_module/package. [txt|html] 命名的文件中;
如果有 report 的话,输出到名为 pylint_global.[txt|html] 的文件中。默认是输出到屏幕上不输出到文件里;
-f <format>, --output-format=<format>
设置输出格式;
可以选择的格式有 text, parseable, colorized, msvs (visual studio) 和 html, 默认的输出格式是 text;
--disable-msg=<msg ids>
禁止指定 id 的 message;
例如:输出中包含了 W0402 这个 warning 的 message, 如果不希望它在输出中出现,可以使用“--disable-msg= W0402”;
--reports=<y_or_n>
默认是 n, 表示 Pylint 的输出中除了包含源代码分析部分,也包含报告部分。
pylint --rcfile=pylintrc.conf --reports=y main.py
报告中安装上述的格式生成检查结果,W代表生成的检查级别,级别分为4种:error, warning, refactor, convention
;可以根据首字母来对应相应的级别。“10, 0”
代表告警所在源码文件中的行号和列号。Unused import help
表述问题的详细信息。(unused-import)
为问题的消息ID信息。
下面的信息是按照消息的类别进行分类,对4种级别的告警信息进行汇总:
--help-msg=
:获取告警帮助信息
如需对某告警类型获取帮助信息,可以使用"pylint --help-msg "
命令来获取:
pylint --help-msg=C0114
在输出中包含 message 的 id, 然后通过 pylint --help-msg=
来查看这个错误的详细信息,这样可以具体地定位错误。
--output-format=
:设置输出格式 可以选择的格式有text, parseable, colorized, msvs (visual studio)
, 默认的输出格式是 text。
pylint --output-format=msvs external.py
xx.txt 将每个 module /package
的 message 输出到一个以 pylint_module/package.txt
命名的文件中,如果有 report 的话,输出到名为 pylint_global.[txt|html]
的文件中。默认是输出到屏幕上不输出到文件里。
pylint --output-format=msvs external.py > test.txt
Pylint的输出
Pylint的默认输出格式是原始文本(raw text)格式 ,可以通过-f
,--output-format=
来指定别的输出格式如html等等。在Pylint的输出中有如下两个部分:源代码分析部分和报告部分。
源代码分析部分:
对于每一个 Python 模块,Pylint 的结果中首先显示一些"*"
字符 , 后面紧跟模块的名字,然后是一系列的 message, message 的格式如下:
MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE
MESSAGE_TYPE 有如下几种: © 惯例。违反了编码风格标准 ® 重构。写得非常糟糕的代码。 (W) 警告。某些 Python 特定的问题。 (E) 错误。很可能是代码中的错误。 (F) 致命错误。阻止 Pylint 进一步运行的错误。
忽略某个文件不进行检查
对external.py不检查,在文件中设置: # pylint: skip-file
# pylint: skip-file
from pysdk.first_layer import BaseLayer
class Events(BaseLayer):
def __init__(self):
# pylint: disable=C0115
super(Events, self).__init__()
class Metrics(BaseLayer):
def __init__(self):
super(Metrics, self).__init__()
忽略文件中执行类型(C,R,W,E,F)不进行检查
对external.py中’W’类型不检查,在文件中设置: # pylint: disable=W
# pylint: disable=W
from pysdk.first_layer import BaseLayer
class Events(BaseLayer):
def __init__(self):
super(Events, self).__init__()
class Metrics(BaseLayer):
def __init__(self):
super(Metrics, self).__init__()
忽略文件中某个函数执行类型(C,R,W,E,F)不进行检查
对external.py中’W,R,E’类型不检查,在文件中类下函数或普通函数下设置: # pylint: disable=W,E,R
from pysdk.first_layer import BaseLayer
class Events(BaseLayer):
def __init__(self):
# pylint: disable=W,R,E
super(Events, self).__init__()
def __init__(self):
super(Events, self).__init__()
class Metrics(BaseLayer):
def __init__(self):
super(Metrics, self).__init__()
忽略文件中某个类执行类型(C,R,W,E,F)不进行检查
对external.py中’W,R,E’类型不检查,在文件中类下面设置: # pylint: disable=C,F,W,E,R
from pysdk.first_layer import BaseLayer
class Events(BaseLayer):
# pylint: disable=C,R,W,E,F
def __init__(self):
super(Events, self).__init__()
def __init__(self):
super(Events, self).__init__()
class Metrics(BaseLayer):
def __init__(self):
super(Metrics, self).__init__()
忽略no-member的提示
代码处修改 # pylint: disable=no-member
pylint --disable=no-member ...
在命令行中使用pylint: disable=W
- 不禁用指定类型 pylint + 目标项目或者文件
编写测试代码文件
执行pylint
执行结果
如果对代码进行规范整改,对整改后的代码再次扫描,则会看到无任何检测状态,评分为10份
或命令行中执行pylint pylint_test.py
- 禁用W类型
pylint --disable=W external.py
配置文件配置
在项目根目录下生成配置文件pylintrc.conf
pylint --generate-rcfile > pylintrc.conf
pylint --persistent=n --generate-rcfile > pylintrc.conf
携带配置文件,针对单个文件的扫描
pylint --rcfile=pylintrc.conf manage.py
对指定项进行disable
配置禁止warning,配置禁止检查指定项
pylint的几种状态:Error(错误) Warning(警告) Refactor(重构) Convention(规范)
--disable=W,E,R,C
--disable=E,R,C
--disable=E,R
对R0801项进行disable之后,再次扫描则会看到不会再输出不符合的结果
pylint设置每行检测字符数 针对每行字符数的修改,默认100
注意:重命名pylint.conf
为.pylintrc
,即不需要每次执行都带上--rcfile
参数。
对整个项目扫描
在项目根目录下右击选择pylint执行
使用pylint有如下几种提示级别Error(错误)、Warning(警告)、Refactor(重构)、Convention(规范)。
输出的结果包括:与规范冲突的位置(行列)、违反的规范编号以及具体的内容提示,会针对检测结果给出一个评分,总分10分。
从检查信息可以看到,上述代码缺少模块注释(Missing module docstring)以及函数注释(Missing function docstring),函数名不符合蛇形命名规范(全由小写字母和下划线组成,在两个单词之间用下滑线连接)等。
生成报告
# 执行
pylint -ry pylint_demo
# 可以看到报告,
# Statistics by type
有三个模块(py文件);类,方法为0;函数为1个
# Raw metrics
代码总共12行,空行有5行,也就是总共8行有效代码
# Messages by category
有3个convention,0个warning,0个error
#### 说明######
1 Pylint结果的级别:error,warning,refactor,convention;
2 可以根据首字母确定相应的级别,例如,C表示convention(规范)、W表示warning(告警)、E表示error(错误);
3 级别之后的数字表示告警所在文件中的行号和列号;
4 参数 “-ry”开启报告,“-rn”关闭报告(只显示警告和错误),默认为关闭报告;
************* Module pylint_demo.s1
pylint_demo/s1.py:1:0: C0114: Missing module docstring (missing-module-docstring)
************* Module pylint_demo.s2
pylint_demo/s2.py:1:0: C0114: Missing module docstring (missing-module-docstring)
pylint_demo/s2.py:7:0: C0116: Missing function or method docstring (missing-function-docstring)
Report
======
8 statements analysed.
Statistics by type
------------------
+---------+-------+-----------+-----------+------------+---------+
|type |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
|module |3 |NC |NC |33.33 |0.00 |
+---------+-------+-----------+-----------+------------+---------+
|class |0 |NC |NC |0 |0 |
+---------+-------+-----------+-----------+------------+---------+
|method |0 |NC |NC |0 |0 |
+---------+-------+-----------+-----------+------------+---------+
|function |1 |NC |NC |0.00 |0.00 |
+---------+-------+-----------+-----------+------------+---------+
Raw metrics
-----------
+----------+-------+------+---------+-----------+
|type |number |% |previous |difference |
+==========+=======+======+=========+===========+
|code |12 |70.59 |NC |NC |
+----------+-------+------+---------+-----------+
|docstring |0 |0.00 |NC |NC |
+----------+-------+------+---------+-----------+
|comment |0 |0.00 |NC |NC |
+----------+-------+------+---------+-----------+
|empty |5 |29.41 |NC |NC |
+----------+-------+------+---------+-----------+
Duplication
-----------
+-------------------------+------+---------+-----------+
| |now |previous |difference |
+=========================+======+=========+===========+
|nb duplicated lines |0 |NC |NC |
+-------------------------+------+---------+-----------+
|percent duplicated lines |0.000 |NC |NC |
+-------------------------+------+---------+-----------+
Messages by category
--------------------
+-----------+-------+---------+-----------+
|type |number |previous |difference |
+===========+=======+=========+===========+
|convention |3 |NC |NC |
+-----------+-------+---------+-----------+
|refactor |0 |NC |NC |
+-----------+-------+---------+-----------+
|warning |0 |NC |NC |
+-----------+-------+---------+-----------+
|error |0 |NC |NC |
+-----------+-------+---------+-----------+
% errors / warnings by module
-----------------------------
+---------------+------+--------+---------+-----------+
|module |error |warning |refactor |convention |
+===============+======+========+=========+===========+
|pylint_demo.s2 |0.00 |0.00 |0.00 |66.67 |
+---------------+------+--------+---------+-----------+
|pylint_demo.s1 |0.00 |0.00 |0.00 |33.33 |
+---------------+------+--------+---------+-----------+
Messages
--------
+---------------------------+------------+
|message id |occurrences |
+===========================+============+
|missing-module-docstring |2 |
+---------------------------+------------+
|missing-function-docstring |1 |
+---------------------------+------------+
------------------------------------------------------------------
Your code has been rated at 6.25/10 (previous run: 6.67/10, -0.42)
pylint的应用场景
pylint可以在许多项目中应用,特别是在大型项目和团队协作中。以下是pylint的一些应用场景:
- 代码规范:对于遵循PEP 8规范的项目,pylint可以帮助我们检查代码的风格是否符合规范,并提供相应的修复建议。
- 代码质量:pylint可以帮助我们检查代码中的一些常见问题,如未使用的变量、未使用的导入和重复的代码等,以提高代码的质量和可维护性。
- 团队协作:在团队协作中,pylint可以帮助我们统一代码风格和质量标准,以提高代码的一致性和可读性。
- 持续集成:在持续集成环境中,pylint可以作为一个检查步骤,帮助我们在代码提交前发现问题,以避免将错误的代码合并到主分支。