复制代码 代码如下:

#coding:utf-8

'''

a test function module

'''

import urllib

import time

def fetch(url):

'''

fetch url

'''

content = urllib.urlopen(url).read()

f_html = open('tmp%s.html' % str(time.time()), 'w')

f_html.write(content)

f_html.close()

def main(urls):

'''

main func to be called

'''

for url in urls:

fetch(url)

if __name__ == '__main__':

FROM_URLS = ['http://www.baidu.com','http://www.sohu.com']

main(FROM_URLS)

基本上有以下几种判断标准:

1、命名方式

2、docstring

当然直接用pylint进行包检测也是可以的:pylint package

参看下面了解更多的使用方法,一定要动手练习才行:

参看内容:

Pylint 的调用

清单 1. Pylint 的调用命令

pylint [options] module_or_package

使用 Pylint 对一个模块 module.py 进行代码检查:

1. 进入这个模块所在的文件夹,运行 pylint [options] module.py

这种调用方式是一直可以工作的,因为当前的工作目录会被自动加入 Python 的路径中。

2. 不进入模块所在的文件夹,运行 pylint [options] directory/module.py

这种调用方式当如下条件满足的时候是可以工作的:directory 是个 Python 包 ( 比如包含一个 __init__.py 文件 ),或者 directory 被加入了 Python 的路径中。

使用 Pylint 对一个包 pakage 进行代码检查:

1. 进入这个包所在文件夹,运行 pylint [options] pakage。

这种调用方式是一直可以工作的,因为当前的工作目录会被自动加入 Python 的路径中。

2. 不进入包所在的文件夹,运行 pylint [options] directory/ pakage。

这种情况下当如下条件满足的时候是可以工作的:directory 被加入了 Python 的路径中。比如在 Linux 上,export PYTHONPATH=$PYTHONPATH: directory。

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

Pylint 的常用命令行参数

-h,–help

显示所有帮助信息。

–generate-rcfile

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

–rcfile=

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

-i , –include-ids=

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

-r , –reports=

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

–files-output=

将每个 module /package 的 message 输出到一个以 pylint_module/package. [txt|html] 命名的文件中,如果有 report 的话,输出到名为 pylint_global.[txt|html] 的文件中。默认是输出到屏幕上不输出到文件里。

-f , –output-format=

设置输出格式。可以选择的格式有 text, parseable, colorized, msvs (visual studio) 和 html, 默认的输出格式是 text。

–disable-msg=

禁止指定 id 的 message. 比如说输出中包含了 W0402 这个 warning 的 message, 如果不希望它在输出中出现,可以使用 –disable-msg= W0402

Pylint 的输出

Pylint的默认输出格式是原始文本(raw text)格式 ,可以通过 -f ,–output-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 的内容

这时候使用 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,可以看到报告部分的内容。

与此相关:

代码审察工具:

http://www.cnblogs.com/LiGleam/archive/2012/02/19/2358549.html

http://www.ibm.com/developerworks/cn/linux/l-cn-pylint/index.html?ca=drs-cn-1217

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

python代码质量检查工具_python代码检查工具pylint 让你的python更规范相关推荐

  1. 计算机软件安装检查工具,正版软件检查工具部署应用培训.pptx

    正版软件检查工具部署应用培训;正版软件检查工具的功能正版软件检查工具的作用正版软件检查工具的安装使用方法 ;正版软件检查工具的功能规;正版软件检查工具的作用规;检查工具网络版安装环境规;1.打开&qu ...

  2. python代码规范工具_Python代码规范Flake8的简单示例

    这篇文章主要为大家详细介绍了Python代码规范Flake8的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  3. 痞子衡嵌入式:恩智浦SDK驱动代码风格、模板、检查工具

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是恩智浦 SDK 驱动的代码风格. 上周痞子衡受领导指示,给 SE 同事做了一个关于 SDK 代码风格的分享.随着组内新人的增多,这样的培训 ...

  4. python的质量控制模块_Python 代码的质量控制之 flake8 Pylint

    为什么需要质量控制工具 无需多言,我偏执地认为,所有动态语言写成的项目,都应该使用 XXLint 之类的工具,该暴露的错误能提前就提前. 甚至,所有项目在 commit 之前都需要做两件事情: lin ...

  5. python 源码保护_Python代码保护

    Python等解释性脚本语言都需要源码明文存储,所以有两种情况需要考虑代码保护的问题: 代码逻辑的保护:代码本身有版权或者不能公开源代码 涉及用户名.密码等关键信息的配置 代码保护方法 Python代 ...

  6. python自然语言处理库_Python自然语言处理工具库(含中文处理)

    自然语言处理(Natural Language Processing,简称 NLP),是研究计算机处理人类语言的一门技术.随着深度学习在图像识别.语音识别领域的大放异彩,人们对深度学习在 NLP 的价 ...

  7. idle不是python自带的开发工具_Python的开发工具

    通常情况下,为了提高开发效率,需要使用相应的开发工具.进行Python开发也可以使用开发工具.下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后,会自动安装一个IDL ...

  8. python代码覆盖率工具_Python代码覆盖率分析工具Coverage

    简介 在测试中,为了度量产品质量,代码覆盖率被作为一种测试结果的评判依据,在Python代码中用来分析代码覆盖率的工具当属Coverage.代码覆盖率是由特定的测试套件覆盖被测源代码的程度来度量,Co ...

  9. python代码块缩进_Python代码需要缩进吗

    Python则是通过缩进来识别代码块的. 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的 ...

最新文章

  1. Homework_4 四则运算 - C#版
  2. 水鱼 学习回顾 <1>
  3. 阿里安全猎户座实验室(Alibaba Orion Security Lab)简介
  4. Python基础-os模块 sys模块
  5. 【LeetCode】两数之和
  6. iOS——Core Animation 知识摘抄(二)
  7. java词法分析_Hive源码系列(七)编译模块之词法、语法解析 (中)
  8. 收集异常,不会给用户弹出异常信息
  9. 几句话介绍MagicAjax
  10. 一个意想不到的CDO.Message 错误
  11. SharePoint 2013 对象模型操作网站设置菜单
  12. 秋无痕 Windows 7 SP1 (64位旗舰版) 集成安装增强版 V2018年春节版(整合USB3+NVMe+UEFI)
  13. matlab 短时能量计算+源代码
  14. html li去掉前面的小黑点 项目符号
  15. w7文件加密提示没启用服务器,win7文件夹设置密码没有密钥提示该怎么解决
  16. [渝粤教育] 西南科技大学 教育心理学 在线考试复习资料
  17. 【图灵学院】JAVA互联网架构【全】
  18. linux服务器安装php7_在CentOS 8上安装PHP 7.2、PHP 7.3、PHP 7.4的方法
  19. 各大互联网厂面试题(付详细答案,持续更新中...)
  20. vb.net 教程 5-9 屏幕范围内取色

热门文章

  1. OpenCASCADE:MFC示例
  2. boost::spirit模块实现使用不同的输出语法格式化单个容器类型的测试程序
  3. boost::range模块实现报告称范围适配器相关的测试程序
  4. boost::mp11::mp_replace_third相关用法的测试程序
  5. boost::mp11::mp_bind_front_q相关用法的测试程序
  6. boost::log::ipc::reliable_message_queue用法的测试程序
  7. boost::bucket_sorter用法的测试程序
  8. boost::format模块format的基本用法示例
  9. Boost:使用行列式函数和transform()算法计算许多4x4矩阵的行列式
  10. ITK:使用FFT的归一化相关