Pylint 是什么

Pylint 是什么

Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码。目前 Pylint 的最新版本是 pylint-0.18.1。

  • Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等。
  • Pylint 的一个很大的好处是它的高可配置性,高可定制性,并且可以很容易写小插件来添加功能。
  • 如果运行两次 Pylint,它会同时显示出当前和上次的运行结果,从而可以看出代码质量是否得到了改进。
  • 目前在 eclipse 的 pydev 插件中也集成了 Pylint。

    PTVS也集成的杠杠的

  • Pylint 的常用命令行参数

    • -h,--help

      显示所有帮助信息。

    • --generate-rcfile

      可以使用 pylint --generate-rcfile 来生成一个配置文件示例。可以使用重定向把这个配置文件保存下来用做以后使用。也可以在前面加上其它选项,使这些选项的值被包含在这个产生的配置文件里。如:pylint --persistent=n --generate-rcfile > pylint.conf,查看 pylint.conf,可以看到 persistent=no,而不再是其默认值 yes。
    • --rcfile=<file>

      指定一个配置文件。把使用的配置放在配置文件中,这样不仅规范了自己代码,也可以方便地和别人共享这些规范。
    • -i <y_or_n>, --include-ids=<y_or_n>

      在输出中包含 message 的 id, 然后通过 pylint --help-msg=<msg-id>来查看这个错误的详细信息,这样可以具体地定位错误。
    • -r <y_or_n>, --reports=<y_or_n>

      默认是 y, 表示 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

    Pylint 的输出

    Pylint的默认输出格式是原始文本(raw text)格式 ,可以通过 -f <format>,--output-format=<format> 来指定别的输出格式如html等等。在Pylint的输出中有如下两个部分:源代码分析部分和报告部分。

    源代码分析部分:

    对于每一个 Python 模块,Pylint 的结果中首先显示一些"*"字符 , 后面紧跟模块的名字,然后是一系列的 message, message 的格式如下:

     MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE

    MESSAGE_TYPE 有如下几种:

    (C) 惯例。违反了编码风格标准

    (R) 重构。写得非常糟糕的代码。

    (W) 警告。某些 Python 特定的问题。

    (E) 错误。很可能是代码中的错误。

    (F) 致命错误。阻止 Pylint 进一步运行的错误。

    清单 2. Pylint 中的 utils 模块的输出结果
     ************* Module utils
     C: 88:Message: Missing docstring
     R: 88:Message: Too few public methods (0/2)
     C:183:MessagesHandlerMixIn._cat_ids: Missing docstring
     R:183:MessagesHandlerMixIn._cat_ids: Method could be a function
     R:282:MessagesHandlerMixIn.list_messages: Too many branches (14/12)

    报告部分:

    在源代码分析结束后面,会有一系列的报告,每个报告关注于项目的某些方面,如每种类别的 message 的数目,模块的依赖关系等等。具体来说,报告中会包含如下的方面:

    • 检查的 module 的个数。
    • 对于每个 module, 错误和警告在其中所占的百分比。比如有两个 module A 和 B, 如果一共检查出来 4 个错误,1 个错误是在 A 中,3 个错误是在 B 中,那么 A 的错误的百分比是 25%, B 的错误的百分比是 75%。
    • 错误,警告的总数量。

      使用 Pylint 分析 Python 代码的具体示例

      下面是一个从 xml 文件中读取一些值并显示出来的一段 Python 代码 dw.py,代码如下:

      清单 3. 源码
      import string
       #!/usr/bin/env python 
      
       import xml.dom.minidom 
      
       xmlDom=xml.dom.minidom.parse("identity.xml")
       organizations = xmlDom.getElementsByTagName(‘DW‘)
       for org in organizations:
      	 products = org.getElementsByTagName(‘linux‘)
          for product in products:
              print ‘ID: ‘ + product.getAttribute(‘id‘)
              print ‘Name: ‘ + product.getAttribute(‘name‘)
              print ‘Word Count: ‘ + product.getAttribute(‘count‘)
      清单 4. identity.xml 的内容
       <IBM>
              <DW>
                      <linux id="100" name="python" count="3000" />
              </DW>
       </IBM>

      这时候使用 Pylint 的结果(这是从 html 格式的输出中拷贝的)为:

      清单 5. Pylint 的分析结果
       ************* Module dw
       C:1:Missing docstring
       C:5:Operator not preceded by a space xmlDom=xml.dom.minidom.parse("identity.xml") ^
       C:5:Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
       C:6:Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) 
      
       Report 部分省略

      输出中第一部分是源代码分析,第二部分是报告。输出结果中有这么多信息,从哪里开始分析呢?首先使用如下的步骤来分析代码:

      1. 因为输出结果太长,所以可以先不让它输出报告部分,先根据源代码分析部分来找出代码中的问题。使用选项 "--reports=n"

      2. 使用选项 "--include-ids=y"。可以获取到源代码分析部分每条信息的 ID。

      清单 6. 使用 pylint --reports=n --include-ids=y dw.py 的结果
      ************* Module dw
      C0111: 1: Missing docstring
      C0322: 5: Operator not preceded by a space xmlDom=xml.dom.minidom.parse("identity.xml") ^
      C0103: 5: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
      C0103: 6: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

      每个信息前面都会加上一个 id, 如果不理解这个信息的意思,可以通过 pylint --help-msg=id来查看。

      清单 7. 使用 pylint --help-msg= C0111 的结果
       C0111: *Missing docstring*
        Used when a module, function, class or method has no docstring. Some special
       methods like __init__ doesn‘t necessary require a docstring.
       This message belongs to the basic checker.

      3. 开始分析每个源代码中的问题。从上面知道,第一个问题的原因是缺少 docstring,在代码中增加 docstring, 修改后的代码如下:

      清单 8. 增加 docstring 修改后的源码
       #!/usr/bin/env python 
      
      """This script parse the content of a xml file"""
      
       import xml.dom.minidom 
      
       xmlDom=xml.dom.minidom.parse("identity.xml")
       organizations = xmlDom.getElementsByTagName(‘DW‘)
       for org in organizations:
          products = org.getElementsByTagName(‘linux‘)
          for product in products:
              print ‘ID: ‘ + product.getAttribute(‘id‘)
              print ‘Name: ‘ + product.getAttribute(‘name‘)
              print ‘Word Count: ‘ + product.getAttribute(‘count‘)

      重新运行 pylint --reports=n --include-ids=y dw.py,结果为:

      清单 9. 运行结果
       ************* Module dw
       C0322:  7: Operator not preceded by a space
       xmlDom=xml.dom.minidom.parse("identity.xml")
            ^
       C0103:  7: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
       C0103:  8: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

      可以看到源代码中的第一个问题已被解决。

      4. 关于第二个 C0322 的问题,这里的分析结果说明得比较清楚,是代码第七行中的等号运算符两边没有空格。我们在这里加上空格,重新运行 pylint --reports=n --include-ids=y dw.py,结果为:

      清单 10. 运行结果
       ************* Module dw
       C0103:  7: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
       C0103:  8: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)

      5. 可以看到现在问题只剩下 C0103 了。这里的意思是变量命名规则应该符合后面正则表达式的规定。Pylint 定义了一系列针对变量,函数,类等的名字的命名规则。实际中我们不一定要使用这样的命名规则,我们可以定义使用正则表达式定义自己的命名规则,比如使用选 项 --const-rgx=‘[a-z_][a-z0-9_]{2,30}$‘,我们将变量 xmlDom改为 xmldom, 代码如下:

      清单 11. 将变量 xmlDom 改为 xmldom 后的源码
       #!/usr/bin/env python 
      
      """This script parse the content of a xml file"""
      
       import xml.dom.minidom 
      
       xmldom = xml.dom.minidom.parse("identity.xml")
       organizations = xmldom.getElementsByTagName(‘DW‘)
       for org in organizations:
          products = org.getElementsByTagName(‘linux‘)
          for product in products:
              print ‘ID: ‘ + product.getAttribute(‘id‘)
              print ‘Name: ‘ + product.getAttribute(‘name‘)
              print ‘Word Count: ‘ + product.getAttribute(‘count‘)

      运行 pylint --reports=n --include-ids=y --const-rgx=‘[a-z_][a-z0-9_]{2,30}$‘ dw.py,结果中就没有任何问题了。

      6. 如果希望一个组里的人都使用这些统一的规则,来规范一个部门的代码风格。比如说大家都使用 --const-rgx=‘[a-z_][a-z0-9_]{2,30}$‘作为命名规则,那么一个比较便捷的方法是使用配置文件。

      使用 pylint --generate-rcfile > pylint.conf来生成一个示例配置文件,然后编辑其中的 --const-rgx选项。或者也可以直接 pylint --const-rgx=‘[a-z_][a-z0-9_]{2,30}$‘ --generate-rcfile > pylint.conf,这样生成的配置文件中 --const-rgx选项直接就是 ‘[a-z_][a-z0-9_]{2,30}$‘了。

      以后运行 Pylint 的时候指定配置文件:pylint --rcfile=pylint.conf dw.py

      这样 Pylint 就会按照配置文件 pylint.conf中的选项来指定参数。在一个部门中,大家可以共同使用同一个配置文件,这样就可以保持一致的代码风格。

      7. 如果把 report 部分加上,即不使用 --reports=n,可以看到报告部分的内容

时间: 2024-08-09 14:39:54

Pylint 是什么的相关文章

pylint

pylint是一款检查语法规则的工具,刚接触python发现确实很多规则和Java不同. 报错的时候,当使用鼠标在vscode中划上之后,将会显示错误,如果对于错误不解,可以在python控制台敲入(目录引导到%Python安装目录%/Script):pylint --help-msg=cXXXX C0111:Missing module docstring,这是尝试在代码顶端声明编码格式的时候报的异常: # -*- coding: utf-8 -*-或者# coding=utf-8画的绿色波浪

vscode Python Pylint(代码检测插件)

暑假刚开始想了解一下Python,使用vscode进行编写,根据vscode 的提示安装了一些不知道干啥的插件,编写过程中提示说  "Linter pylint is not installed"  之后参训了解到:我们只在vscode里面下载了辅助插件,但是没有下载Python的扩展安装包. 在安装Python过程中还会遇到 ImportError: No module named setuptools(安装模块出错的问题). 原因:这是新手很常遇见的错误提示.不用担心,这是因为Wi

Pylint的安装

简介 本文介绍了在Ubuntu 9和Python 2.6开发环境下,如何安装pylint工具:并简单介绍pylint与Eclipse+PyDev开发环境的集成. Pylint介绍 如果你用过C/C++开发环境中lint静态代码检查工具,你就知道此工具的威力:对于规范代码,及时检查出代码中的语法与逻辑错误,提高你对语言本身的理解等方面具有重要作用.针对Python语言,我们可以使用Pylint工具. 如果你想对Pylint工具有更多了解的话,可以访问其官方网址:http://www.pylint.

如何使用 Pylint 来规范 Python 代码风格

https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/ Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如

pycharm中添加扩展工具pylint

今天调试了好几个小时,想吧pylint集成到pycharm中去,从网上找了个宝贝帖 子,但是不好用,原因是作者写的脚本是检查工程和模块的,而我的是单独检查一个文件,当然前者肯定会在项目后期用的.所以就用Pycharm调试了作者的 脚本,知道了python的sys.argv的使用,接受运行时参数用的.当然,调试的时候也可以输入,正如C++的IDE VC++的调试,sys.argv[0]默认是当前文件,带路径名,所以真正的输入参数是从sys.argv[1]开始的. Run-Edit Configur

Pylint Error Message: “E1101: Module &#39;xxx&#39; has no &#39;xxx&#39; member&#39;”

原因:Pylint默认只信任来自标准库stdlib的C扩展,而忽略其他的.模块'xxx'不是stdlib的一部分,需要手动将其添加到白名单. 解决方案: 在terminal里 (例如Windows 平台的powershell)导航到项目所在目录: 为Pylint生成rcfile文件: 1 pylint --generate-rcfile > .pylintrc 打开生成的文件.pylintrc,将模块名添加至白名单:extension-pkg-whitelist=xxx.以 lxml为例,结果为

Python代码分析工具:PyChecker、Pylint

1 概述 PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告. PyChecker可以工作在多种方式之下.首先,PyChecker会导入所检查文件中包含的模块,检查导入是否正确,同时检查文件中的函数.类和方法等. PyChecker可以检查出来的问题有如下几种: 全局量没有找到,比如没有导入模块 传递给函数.方法.构造器的参数数目错误 传递给内建函数和方法的参数数目错误 字符串格式化信息不匹配 使用不存在的类方法和属

使用Pylint规范你的Python代码

Pylint是一个Python代码风格的检查工具,功能上类似于pychecker,默认用PEP8作为代码风格标准,它所提供的功能包括:检查代码行的长度,检查变量命名是否符合规范,检查声明的接口是否被真正的实现等等,详细信息参考:http://docs.pylint.org/. 安装: sudo apt-get install pylint ? #Ubuntu pip install pyint ? #windows 更多安装方式可以查看:http://www.pylint.org/#instal

pylint window下安装与使用

简介 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好处是它的高可配置性,高可定制性,并且可以很容易写小插件来添加功能. 如果运行两次 Pylint,它会同时显示