点击这里:如何使用 Pylint 来规范标准 Python 代码风格

  Pyl 是什么

  Pyl个 Python 代码分析工具它分析 Python 代码中查找不符合代码风格标准和有潜在问题代码目前 Pyl 最新版本是 pyl-0.18.1

  Pyl个 Python 工具除了平常代码分析工具作用的外它提供了更多功能:如检查行代码长度变量名是否符合命名标准个声明过接口是否被真正实现等等

  Pyl 个很大好处是它高可配置性高可定制性并且可以很容易写小插件来添加功能

  如果运行两次 Pyl它会同时显示出当前和上次运行结果从而可以看出代码质量是否得到了改进

  目前在 eclipse pydev 插件中也集成了 Pyl

  Pyl 具体介绍

  Pyl 安装

  Pyl 可以用于所有高于或者等于 2.2 Python 版本兼容需要 logilab-astng(version >= 0.14)和 logilab-common(version >= 0.13)包(具体信息请参阅 参考资料)如果是 Python 版本低于 2.3那么它还需要 optik 包(本文接下来举例暂不考虑这种情况)

  Pyl 所用到所有下载地址

  logilab-astng 最新包下载:http://www.logilab.org/856/

  logilab-common 最新包下载:http://www.logilab.org/848/

  optik 包下载:http://optik.sourceforge.net/

  Pyl 最新包下载:http://www.logilab.org/project/pyl

  Pyl 在 Linux 上安装

  1. 在 Linux 上首先安装 Python 包(高于版本 2.2)并在环境变量 $PATH 中添加 Python 可执行文件路径

  2. 下载 Pyl、logilab-astng (version >= 0.14) 和 logilab-common (version >= 0.13) 包 , 使用 tar zxvf *.tar.gz解压缩这些包

  3. 依次进入 logilab-astng、logilab-common 和 Pyl 解开文件夹中运行命令 Python up.py 来安装

  4. 安装完成后就可以通过 pyl [options] module_or_package来 Pyl

  Pyl 在 Windows 上安装

  1. 安装 Python 包(高于版本 2.2)右键单击桌面上电脑图标选择属性高级环境变量在 $PATH 中添加 Python 安装路径如 C:\Python26\

  2. 使用解压缩工具解压缩所有

  3. 打开命令行窗口使用 cd依次进入 logilab-astng、logilab-common 和 Pyl 解开文件夹中运行命令 python up.py 来安装

  4. 安装完成后在 Python 安装路径下出现个 Scripts 文件夹里面包含些 bat 脚本如 pyl.bat 等

  5. 为了使 pyl.bat 时候不需要输入完整路径在 Python 安装目录下创建 pyl.bat 重定向文件这是个纯文本文件 pyl.bat里面包含 pyl.bat 实际路径如:C:\Python26\Scripts\pyl.bat

  6. 安装完成后可以通过 pyl [options] module_or_package来 Pyl

  Pyl


清单 1. Pyl 命令
 pyl [options] module_or_package 

  使用 Pyl个模块 module.py 进行代码检查:

  1. 进入这个模块所在文件夹运行 pyl [options] module.py
这种方式是直可以工作当前工作目录会被自动加入 Python 路径中

  2. 不进入模块所在文件夹运行 pyl [options] directory/module.py
这种方式当如下条件满足时候是可以工作:directory 是个 Python 包 ( 比如包含个 __init__.py 文件 )或者 directory 被加入了 Python 路径中

  使用 Pyl个包 pakage 进行代码检查:

  1. 进入这个包所在文件夹运行 pyl [options] pakage
这种方式是直可以工作当前工作目录会被自动加入 Python 路径中

  2. 不进入包所在文件夹运行 pyl [options] directory/ pakage
这种情况下当如下条件满足时候是可以工作:directory 被加入了 Python 路径中比如在 Linux 上export PYTHONPATH=$PYTHONPATH: directory

  此外对于安装了 tker 包机器可以使用命令 pyl-gui打开个简单 GUI 界面在这里输入模块或者包名字 ( 规则同命令行 ), 点击 RunPyl 输出会在 GUI 中显示

  Pyl 常用命令行参数

  -h,--help

  显示所有帮助信息

  --generate-rcfile

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

  --rcfile=<file>

  指定个配置文件把使用配置放在配置文件中这样不仅规范标准了自己代码也可以方便地和别人共享这些规范标准

  -i <y_or_n>, ---ids=<y_or_n>

  在输出中包含 message id, 然后通过 pyl --help-msg=<msg-id>来查看这个详细信息这样可以具体地定位

  -r <y_or_n>, --reports=<y_or_n>

  默认是 y, 表示 Pyl 输出中除了包含源代码分析部分也包含报告部分

  --files-output=<y_or_n>

  将每个 module /package message 输出到个以 pyl_module/package. [txt|html] 命名文件中如果有 report 输出到名为 pyl_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

  Pyl 输出

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

  源代码分析部分:

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

 MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE 

  MESSAGE_TYPE 有如下几种:

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

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

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

  (E) 很可能是代码中

  (F) 致命阻止 Pyl步运行


清单 2. Pyl utils 模块输出结果
 ************* Module utils 
 C: 88:Message: Missing doc 
 R: 88:Message: Too few public methods (0/2) 
 C:183:MessagesHandlerMixIn._cat_ids: Missing doc 
 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%

  警告总数量

  使用 Pyl 分析 Python 代码具体举例

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


清单 3. 源码
  import  
 #!/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: 
    pr 'ID: ' + product.getAttribute('id') 
    pr 'Name: ' + product.getAttribute('name') 
    pr 'Word Count: ' + product.getAttribute('count') 


清单 4. identity.xml 内容
 <IBM> 
    <DW> 
        <linux id="100" name="python" count="3000" /> 
    </DW> 
 </IBM> 


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


清单 5. Pyl 分析结果
 ************* Module dw 
 C:1:Missing doc 
 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 部分省略 


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

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

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


清单 6. 使用 pyl --reports=n ---ids=y dw.py 结果
************* Module dw 
C0111: 1: Missing doc 
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, 如果不理解这个信息意思可以通过 pyl --help-msg=id来查看


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


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


清单 8. 增加 doc 修改后源码
 #!/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: 
    pr 'ID: ' + product.getAttribute('id') 
    pr 'Name: ' + product.getAttribute('name') 
    pr 'Word Count: ' + product.getAttribute('count') 


  重新运行 pyl --reports=n ---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. 有关第 2个 C0322 问题这里分析结果介绍说明得比较清楚是代码第 7行中等号运算符两边没有空格我们在这里加上空格重新运行 pyl --reports=n ---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 了这里意思是变量命名规则应该符合后面正则表达式规定Pyl 定义了系列针对变量类等名字命名规则实际中我们不定要使用这样命名规则我们可以定义使用正则表达式定义自己命名规则比如使用选项 --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: 
    pr 'ID: ' + product.getAttribute('id') 
    pr 'Name: ' + product.getAttribute('name') 
    pr 'Word Count: ' + product.getAttribute('count') 


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

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



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

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

  这样 Pyl 就会按照配置文件 pyl.conf中选项来指定参数个部门中大家可以共同使用同个配置文件这样就可以保持代码风格

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

  结束语

  本文通过详细理论介绍和简单易懂例子全面介绍了 Python 代码分析工具 Pyl相信读者看完后定可以轻松地将 Pyl 运用到自己开发工程中



Tags:  qq空间风格代码大全 点击这里

延伸阅读

最新评论

发表评论