1、是什么?
它是一个用于代码分析的工具, 该工具会对代码里的错误展开分析, 去查找那些不符合代码风格标准的代码 , 此标准默认采用的是PEP 8 , 若想了解具体信息 , 可参阅相关参考资料 , 同时它还要查找存在潜在问题的代码, 当前其最新版本是 -0.18.1。
这是一种工具, 它可发挥平常代码分析工具本就具备的作用, 除此之外, 它还能提供更多功能, 比如说检查一行代码的长短, 查看变量名是否契合命名标准, 考证一项已声明的接口是否被切实实现, 等等。
它有着一个极大的优势, 那在于其具备高度的可配置性能, 拥有高度的可定制特性, 而且能够轻轻松松地编写小型插件用以增添功能。
要是运行了两次, 它会一并呈现出当下以及上一回的运行成果, 进而能够知晓代码质量是不是有了提升。
目前在 的 pydev 插件中也集成了 。
这是一个用于检查代码风格的工具, 该工具所依据的标准乃是Guido van的PEP8。
如同于, 不过给予了更多的功能, 像是检查代码行的长短, 查验变量命名是不是契合编码规范, 又或者查看声明的接口有没有被切实地实现, 完整的检查功能在请参见处。
最大限度厉害就在它特别高程度的能够去配置以及能够去定制, 你能够轻松容易地撰写一个小小的插件增添个人专属功能。
安装方法:pip
2、为什么使用?
若想写出好代码, 那什么才是好代码呢? 是符合团队编码习惯的代码, 是有着统一命名的代码, 是具备统一结构的代码。
它的类似产品是什么?
你还有啥补充?
3、 怎么使用?
基础使用:
依据三种代码开展测时工作,通过持续按照提示予以重构,得分起始于1分,最终达成10分。
.py:
#:utf-8
time
def a(url):
= .(url).read()
将时间戳转换为字符串, 然后与'tmp'进行拼接形成文件名, 以写入模式打开该文件, 并将文件对象赋值给变量f。
f.write()
f.close()
def main(urls):
for url in urls:
a(url)
if == '':
urls =
'',''
main(urls)
修改命名:
.py:
#:utf-8
time
def fetch(url):
= .(url).read()
等于打 开某个以‘tmp’这个字符串加上当前时间戳转换为字符串后再加上‘.html’所构成的文件, 并且是以写入这种方式来展开操作。
.write()
.close()
def main(urls):
for url in urls:
fetch(url)
if == '':
=
'',''
main()
再次修改:
.py:
#:utf-8
'''
a test
'''
time
def fetch(url):
'''
fetch url
'''
= .(url).read()
= open('tmp%s.html' % str(time.time()), 'w')
.write()
.close()
def main(urls):
'''
main func to be
'''
for url in urls:
fetch(url)
if == '':
=
'',''
main()
基本上有以下几种判断标准:
1、命名方式
2、
当然直接用进行包检测也是可以的:
参看下面了解更多的使用方法,一定要动手练习才行:
参看内容:
的调用
清单 1. 的调用命令
使用 对一个模块 .py 进行代码检查:
1. 进入这个模块所在的文件夹,运行 .py
这种调用方式, 是始终能够开展工作的, 原因在于, 会将当前的工作目录, 自动融入路径里面。
2. 不进入模块所在的文件夹,运行 /.py
有如下状况, 当该条件得以满足之际即可开展相应工作: 此调用方式的前提是, 它属于一种包(举例来讲, 其中含有一个.py 文件), 或者该包已被添加至相应的路径之中。
使用 对一个包 进行代码检查:
1. 进入这个包所在文件夹,运行 。
这种调用方式是一直可以工作的,因为当前的工作目录会被自动加入 的路径中。
2. 不进入包所在的文件夹,运行 / 。
在这种情形之下, 当如下这般的条件得以实现满足的时候, 它是能够投入工作运行的: 其被增添加入了的路径之中。以在 Linux 这一环境场景之上为例呈现来说, 它等于$:。
另外, 针对于安装了包的机器而言, 能够运用命令 -gui去打开一个简易的GUI界面, 在这个界面当中按照规则同命令行那样输入模块或者包的称呼, 而后点击Run, 其输出会于GUI里呈现出来。
的常用命令行参数
-h,–help
显示所有帮助信息。
–-
能够运用 –- 去生成一个配置文件示例, 能够借助重定向将此配置文件保存下来以供后续使用, 还能够为其添加其他选项, 以使这些选项的数值被纳入到这个所生成的配置文件之中, 就像: –=n –- >.conf, 查看.conf, 能够见到 =no, 而非其原本的默认值 yes。
–=
指明一个配置文件, 将所使用的配置放置到配置文件里,如此一来, 不但使自身代码得以规范, 而且能够便捷地跟他人分享这些规范。
-i , –-ids=
要在输出里头包含那个 的 id, 接着借助 –help-msg=去查看有关这个错误的详细信息内容, 经过这种方式能够确切地定位出错误所在之处哦。
-r , –=
在默认状态下, 其呈现为 y, 这意味着在相关的输出范围之内, 除去涵盖源代码分析这一特定部分以外, 同时还包括报告这一另外的部分。
–files-=
将每一个, 的, 输出至一个以 / 来命名的文件当中, 要是存在的话, 输出至名为. 的文件里。默认状态下是输出到屏幕之上而非输出到文件之中。
-f , –-=
对输出格式进行设置, 有多种格式可供选择, 其中包括text, 还有其他一些格式, 比如msvs ( ), 以及html, 而在这些格式里, 默认为输出格式的是text。
–-msg=
对于指定id的情况是予以禁止的, 比如说, 要是输出里包含了叫W0402这个内容的话, 倘若不希望它出现在输出当中, 那么可以采用 –-msg= W0402。
的输出
的默认输出格式乃原始文本, 也就是raw text格式, 能够凭借 -f , –-= 去指定别的诸如html等输出格式。在其输出之中, 存在如下两个部分: 源代码分析部分, 报告部分。
源代码分析部分:
对于每一个模块, 结果里最先呈现一些 “*” 字符, 其后紧接着模块的名字, 接着是展示一系列的某种格式, 像这样子:
: :
有如下几种:
(C) 惯例。违反了编码风格标准
(R) 重构。写得非常糟糕的代码。
(W) 警告。某些 特定的问题。
(E) 错误。很可能是代码中的错误。
(F) 致命错误。阻止 进一步运行的错误。
清单 2. 中的 utils 模块的输出结果
************* utils
C: 88::
R: 88:: Too few (0/2)
C:183:.:
R:183:.: could be a
R:282:.: Too many (14/12)
报告部分:
在源代码分析终结之后, 将会存在一系列的报告, 每一个报告聚焦于项目的某些特定之处, 像是每一种类别的数量这样的情况啦, 又以及模块的依赖关系等等之类的。具体而言, 报告之中会涵盖如下这般的方面:
检查的 的个数。
对于每一个, 其中错误以及警告各自所占得的百分比。比如说存在两个, 分别是A与B, 要是总共检查出来4个错误, 其中1个错误处于A当中, 3个错误处于B当中, 那么A的错误所占百分比是25%, B的错误所占百分比是75%。
错误,警告的总数量。
回页首
使用 分析 代码的具体示例
这边呈现的是一段代码dw.py, 它是用于从xml文件里读取某些值进而做显示操作的, 代码的具体内容如下:
清单 3. 源码
#!/usr/bin/env
xml.dom.
=xml.dom..parse(“.xml”)
= .(‘DW')
for org in :
= org.(‘linux')
for in :
print ‘ID: ‘ + .(‘id')
print ‘Name: ‘ + .(‘name')
清单 4. .xml 的内容
在这个时候进行使用, 所产生的结果(此结果乃是于html格式的输出里进行拷贝而得来的)呈现为:
清单 5. 的分析结果
************* dw
C:1:
C 是 5, 并非通过一个空格 等于 xml.dom 而后点.parse 接着是点(.xml), 并且有一个脱字符(^)
C说5, 名称为空, 匹配星号或者以双下划线开头并以双下划线结尾的任意字符序列后结束。
C, 6, 名称为“”, 匹配((*)|(__.*__))$。
部分省略
输出结果里, 第一部分呈现的是源代码分析, 第二部分展示的是报告。在输出结果当中存在这么大量的信息, 究竟是要从哪一处着手进行分析啊呢? 首先先要运用如下这般的步骤去分析代码:
1. 由于输出得来的结果长度过长, 因而能够先不让其输出报告的部分, 先依据源代码分析的部分去找出代码当中存在的问题, 运用选项 “–=n”。
2. 运用选项 “–-ids=y”, 会得到源代码分析部分每条信息的 ID。
清单6, 使用, 减等于n, 减减, ids等于y, dw.py的结果。
************* dw
C0111: 1:
将其改写为多个小分句呈现: C0322, 5, 不是通过一个空格, 等于xml.dom..parse(“.xml”), 异或!
有一个名为C0103的情况, 其编号为5, 它涉及到一个名为“”的名称, 该名称需匹配以(*)或者(__.*__)结尾的情况。
C0103, 6, 名为双引号, 匹配星号或下划线开头和结尾且中间包含任意字符的字符串, 之后跟着美元符号。
每条信息之前, 都会添加上一个id , 倘若不明白该信息究竟是什么意思的话, 能够借助 –help-msg=id去进行查看。
清单7, 使用, 其结果是 –help-msg= C0111。
C0111: * *
用到的时候, 某个, 某个, 类或, 有不, 没有, 一些有的没的, 某个, 某个。
like doesn't a .
This to the basic .
3. 着手对逐个源代码里的问题展开剖析。依据从上面所获取到的情况来看, 第一个问题的缘由在于存在缺失的状况, 于代码当中增添相应内容, 修改过后的代码呈现如下:
清单 8. 增加 修改后的源码
#!/usr/bin/env
xml.dom.
=xml.dom..parse(“.xml”)
= .(‘DW')
for org in :
= org.(‘linux')
for in :
print ‘ID: ‘ + .(‘id')
print ‘Name: ‘ + .(‘name')
print ‘Word Count: ‘ + .(‘count')
重新运行 –=n –-ids=y dw.py,结果为:
清单 9. 运行结果
************* dw
C0322: 7: not by a space
=xml.dom..parse(“.xml”)
C0103, 7, 名为空字符串, 匹配星号或者"__"开头且以"__"结尾的字符串。
C0103, 8, 名为“”, 匹配((*)|(__.*__))$。
可以看到源代码中的第一个问题已被解决。
4. 关于那第二个C0322的问题, 这处的分析结果阐释得较为明晰, 在于代码第七行里等号运算符两侧并无空格, 我们于此时此刻去加以空格, 再度运行, 运行的是–=n –-ids=y dw.py, 其结果呈现为:
清单 10. 运行结果
************* dw
C0103: 7: name “” ( match ((*)|(__.*__))$)
C0103: 8: name “” ( match ((*)|(__.*__))$)
5. 能够瞧见此刻问题仅余 C0103 了。这儿所表达的意思是, 变量命名规则理应契合后续正则表达式的规定。针对变量、函数、类等的名字, 定义了一系列的命名规则。在实际情形中, 我们并非一定要采用这般的命名规则, 我们能够通过正则表达式来定义自身的命名规则, 例如运用选项 –const-rgx='{2,30}$', 我们把变量予以更改, 代码如下:
清单 11. 将变量 改为 后的源码
#!/usr/bin/env
“”"This parse the of a xml file”"”
xml.dom.
= xml.dom..parse(“.xml”)
= .(‘DW')
for org in :
= org.(‘linux')
for in :
print ‘ID: ‘ + .(‘id')
print ‘Name: ‘ + .(‘name')
print ‘Word Count: ‘ + .(‘count')
执行, 进行减等于n, 再减减, 让ids等于y, 设置常量正则表达式为'{2,30}$', 运行dw.py, 如此一来, 结果里便是不存在任何问题的了。
6. 假若是期望一组之中的所有人都运用这些整齐划一的规则, 以此去规整一个部门代码的风格, 举例来讲, 所有人都采用 –const-rgx='{2,30}$'当作命名的准则, 那么有一种相对便捷的办法是运用配置文件。
采取一种方式, 借助 –- > .conf去生成一个用于示范的、可供设定的配置文件, 随后对其中的 –const-rgx选项加以编辑。或者还能够直接这样操作, 即 –const-rgx='{2,30}$' –- > .conf, 通过这般操作生成的配置文件里头, 其所具备的 –选项直接呈现为 ‘{2,30}$'。
以后在运行之际, 要去指定相关的, 配置文件, 其内容为 –=.conf dw.py。
如此一来, 便会依据配置文件.conf里的选项去指定参数, 于一个部门当中, 众人能够共同运用同一个配置文件, 这般便可维持一致的代码风格。
7. 要是把那所谓部分添加上去, 也就是不启用而用 –= n, 这样便能够看见呈现出部分情况那报告上面的相应内容了。
原文来自:
写的不错哦