[1263]python代码分析工具pylint

Python
242
0
0
2024-04-23
标签   Python库

简介

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的一些应用场景:

  1. 代码规范:对于遵循PEP 8规范的项目,pylint可以帮助我们检查代码的风格是否符合规范,并提供相应的修复建议。
  2. 代码质量:pylint可以帮助我们检查代码中的一些常见问题,如未使用的变量、未使用的导入和重复的代码等,以提高代码的质量和可维护性。
  3. 团队协作:在团队协作中,pylint可以帮助我们统一代码风格和质量标准,以提高代码的一致性和可读性。
  4. 持续集成:在持续集成环境中,pylint可以作为一个检查步骤,帮助我们在代码提交前发现问题,以避免将错误的代码合并到主分支。