我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python代码分析工具:PyCheck

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python代码分析工具:PyCheck

1 概述


PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告。

PyChecker可以工作在多种方式之下。首先,PyChecker会导入所检查文件中包含的模块,检查导入是否正确,同时检查文件中的函数、类和方法等。

PyChecker可以检查出来的问题有如下几种:

  • 全局量没有找到,比如没有导入模块

  • 传递给函数、方法、构造器的参数数目错误

  • 传递给内建函数和方法的参数数目错误

  • 字符串格式化信息不匹配

  • 使用不存在的类方法和属性

  • 覆盖函数时改变了签名

  • 在同一作用域中重定义了函数、类、方法

  • 使用未初始化的变量

  • 方法的第一个参数不是self

  • 未使用的全局量和本地量(模块或变量)

  • 未使用的函数/方法的参数(不包括self)

  • 模块、类、函数和方法中没有docstring


2 使用


从官网下载最新版本的PyChecker之后,解压安装即可:python setup.py install

首先可以在解压后的目录中测试一番:

[root@rango pychecker-0.8.19]# pychecker setup.py
Processing module setup (setup.py)...

Warnings...

[system path]/distutils/command/bdist_wininst.py:271: Statement appears to have no effect

[system path]/distutils/command/build_scripts.py:80: No class attribute (dry_run) found
[system path]/distutils/command/build_scripts.py:97: No class attribute (dry_run) found
[system path]/distutils/command/build_scripts.py:120: (file) shadows builtin
[system path]/distutils/command/build_scripts.py:121: No class attribute (dry_run) found

[system path]/distutils/command/install_data.py:62: (dir) shadows builtin
[system path]/distutils/command/install_data.py:64: (dir) shadows builtin
[system path]/distutils/command/install_data.py:66: (dir) shadows builtin

[system path]/distutils/command/install_scripts.py:52: (file) shadows builtin
[system path]/distutils/command/install_scripts.py:53: No class attribute (dry_run) found

19 errors suppressed, use -#/--limit to increase the number of errors displayed

可以看到,检查的结果将setup.py依赖的一些文件中的语法错误或者警告都列举出来了,使用--only参数可以只检查自身的语法问题:

[root@rango pychecker-0.8.19]# pychecker --only setup.py
Processing module setup (setup.py)...

Warnings...

None


参数和选项说明:pychecker [options] file1.py file2.py ...

--only        只给出命令行的文件的警告,默认为no

-#,--limit    显示的最大警告数,默认为10

--no-shadowbuiltin    检查是否有变量覆盖了内建变量,默认为off

-q,--stdlib        忽略标准库的文件的警告,默认为off

-T,--argsused    未使用的方法/函数的关键字,默认为on


修改默认配置和行为:.pycheckrc文件,该文件放置在$HOME目录下,--rcfile选项可以生成一份默认的配置文件。

要禁止一些模块/函数/类/方法的警告信息,可以在.pycheckrc文件中定义一个禁止字典,键类似:

‘module’,‘module.function’,'module.class'等。


或者直接在代码中定义:

__pychecker__ = 'no-namedargs maxreturns=0 unsednames=foo,bar'    

其中__pychecker__格式的值和在禁止字典中的值是一样的


在代码文件中导入PyChecker模块及使用:

import pychecker.checker

这将会检查所有在PyChecker之后导入的模块,之前的不检查。


如果不能传递命令行参数,可以使用:

os.environ['PYCHECKER'] = 'command line options here'

等价于在shell环境中设置PYCHECKER:

PYCHECKER='no-namedargs maxreturns=0' /path/to/your/program


要关闭警告,可以在导入PyChecker之前,加上:

os.environ['PYCHECKER_DISABLED'] = 1

等价于在shell环境中设置PYCHECKER_DISABLED:

PYCHECKER_DISABLED=1 /path/to/your/program


3 Pylint


相比于PyChecker,Pylint是一个高阶的Python代码分析工具,它分析Python代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码。目前 Pylint 的最新版本是 pylint-1.2.1。可以检查一行代码的长度、变量名是否符合规范等。运行两次可以看出代码是否改进,分数是否有所提高,10分满分。

3.1 安装Pylint

从官网下载最新版本,解压之后,执行:python setup.py install,安装完毕


3.2 使用Pylint

命令行:pylint [options] module_or_package

图形化:pylint-gui

注解:pylint-gui依赖tkinter,安装tkinter:yum install -y tkinter


3.3 输出信息

Message_Type

(C) convention惯例。违反了编码风格标准
(R) refactor重构。写得非常糟糕的代码。
(W) warning警告。某些 Python 特定的问题。
(E) error错误。很可能是代码中的错误。
(F) 致命错误。阻止 Pylint 进一步运行的错误。


Report

report报告用来统计一些message类型的数量,模块的依赖等。检查module的数量,每个module错误和警告所占百分比


Global evaluation

代码评分

Global evaluation
-----------------
Your code has been rated at 7.98/10


示例:检查pylint-1.2.1目录下的setup.py文件:pylint setup.py

No config file found, using default configuration
************* Module pylint-1.2.1.setup
I:  3, 0: Locally disabling reimported (W0404) (locally-disabled)
I:  3, 0: Locally disabling redefined-builtin (W0622) (locally-disabled)
I:  3, 0: Locally disabling pointless-except (W0704) (locally-disabled)
I:  3, 0: Locally disabling unused-argument (W0613) (locally-disabled)
I: 42, 0: Locally disabling no-name-in-module (E0611) (locally-disabled)
C: 11, 0: Line too long (81/80) (line-too-long)
C:179, 0: Wrong hanging indentation.
               'pylint = pylint:run_pylint',
           |   ^ (bad-continuation)
C:180, 0: Wrong hanging indentation.
               'pylint-gui = pylint:run_pylint_gui',
           |   ^ (bad-continuation)
C:181, 0: Wrong hanging indentation.
               'epylint = pylint:run_epylint',
           |   ^ (bad-continuation)
C:182, 0: Wrong hanging indentation.
               'pyreverse = pylint:run_pyreverse',
           |   ^ (bad-continuation)
C:183, 0: Wrong hanging indentation.
               'symilar = pylint:run_symilar',
           |   ^ (bad-continuation)
C:184, 0: Wrong hanging indentation.
               ]}
       |   |   ^ (bad-continuation)
C:199, 0: Wrong continued indentation.
                            'build_py': build_py},
                          | ^ (bad-continuation)
C:202, 0: No space allowed before :
if __name__ == '__main__' :
                         ^ (bad-whitespace)
F: 54, 0: Unable to import '__pkginfo__' (import-error)
C: 57, 0: Invalid constant name "distname" (invalid-name)
C: 58, 0: Invalid constant name "scripts" (invalid-name)
C: 59, 0: Invalid constant name "data_files" (invalid-name)
C: 60, 0: Invalid constant name "subpackage_of" (invalid-name)
C: 61, 0: Invalid constant name "include_dirs" (invalid-name)
C: 62, 0: Invalid constant name "ext_modules" (invalid-name)
C: 63, 0: Invalid constant name "install_requires" (invalid-name)
C: 64, 0: Invalid constant name "dependency_links" (invalid-name)
C: 71, 4: Invalid constant name "long_description" (invalid-name)
C: 73, 4: Invalid constant name "long_description" (invalid-name)
C:139,24: Invalid variable name "n" (invalid-name)
W:138,30: Unused variable 'dirnames' (unused-variable)
R:105, 0: Too many public methods (32/20) (too-many-public-methods)


Report
======
109 statements analysed.

Statistics by type
------------------

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
|module   |1      |1          |=          |100.00      |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|class    |1      |1          |=          |100.00      |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|method   |2      |2          |=          |100.00      |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|function |3      |3          |=          |100.00      |0.00     |
+---------+-------+-----------+-----------+------------+---------+



Duplication
-----------

+-------------------------+------+---------+-----------+
|                         |now   |previous |difference |
+=========================+======+=========+===========+
|nb duplicated lines      |0     |0        |=          |
+-------------------------+------+---------+-----------+
|percent duplicated lines |0.000 |0.000    |=          |
+-------------------------+------+---------+-----------+



Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |20     |20       |=          |
+-----------+-------+---------+-----------+
|refactor   |1      |1        |=          |
+-----------+-------+---------+-----------+
|warning    |1      |1        |=          |
+-----------+-------+---------+-----------+
|error      |0      |0        |=          |
+-----------+-------+---------+-----------+



Messages
--------

+------------------------+------------+
|message id              |occurrences |
+========================+============+
|invalid-name            |11          |
+------------------------+------------+
|bad-continuation        |7           |
+------------------------+------------+
|locally-disabled        |5           |
+------------------------+------------+
|unused-variable         |1           |
+------------------------+------------+
|too-many-public-methods |1           |
+------------------------+------------+
|line-too-long           |1           |
+------------------------+------------+
|import-error            |1           |
+------------------------+------------+
|bad-whitespace          |1           |
+------------------------+------------+



Global evaluation
-----------------
Your code has been rated at 7.98/10 (previous run: 7.98/10, +0.00)

Raw metrics
-----------

+----------+-------+------+---------+-----------+
|type      |number |%     |previous |difference |
+==========+=======+======+=========+===========+
|code      |133    |68.56 |133      |=          |
+----------+-------+------+---------+-----------+
|docstring |18     |9.28  |18       |=          |
+----------+-------+------+---------+-----------+
|comment   |28     |14.43 |28       |=          |
+----------+-------+------+---------+-----------+
|empty     |15     |7.73  |15       |=          |
+----------+-------+------+---------+-----------+



External dependencies
---------------------
::

   setuptools (pylint-1.2.1.setup)
     \-command
       \-install_lib (pylint-1.2.1.setup)


3.4 常用命令行参数和选项

  • -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



3.5 高阶部分

Pylint可以自定义配置文件,具有高可配置性,高可定制性,并且可以很容易写小插件来添加功能。

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

                                                                                                                               ——游响云停



免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python代码分析工具:PyCheck

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python代码分析工具:PyCheck

1 概述PyChecker是Python代码的静态分析工具,它能够帮助查找Python代码的bug,而且能够对代码的复杂度和格式等提出警告。PyChecker可以工作在多种方式之下。首先,PyChecker会导入所检查文件中包含的模块,检查
2023-01-31

代码分析工具 Pylint安装+pych

Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8)和有潜在问题的代码。 。它与几个流行的编辑器和IDE很好地集成,也可以从命令行运行
2023-01-30

PHP中封装性的静态代码分析工具

引言:随着Web应用的不断发展,PHP已经成为了一种广泛使用的编程语言。然而,由于PHP语言的灵活性和简易性,很容易写出复杂、难以维护的代码。为了解决这个问题,开发人员经常需要使用静态代码分析工具来检测潜在的问题和提供最佳实践建议。本文将介
2023-10-21

密码统计分析工具pipal

密码统计分析工具pipal
2023-06-04

python代码覆盖率工具——cover

今天发现了一个好用的python代码覆盖率检查工具:coverage, 可以高亮显示代码中哪些语句未被执行,哪些执行了,方便单测。环境: Linux x86_64 (不能连外网)下载: 上 https://pypi.python.org/
2023-01-31

Python实例代码分析

这篇“Python实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python实例代码分析”文章吧。1.交换两个变
2023-06-27

代码扫描工具

代码扫描工具1. sonar2.ali的stc平台用的是:findbugs 和 pmd参考:测试框架:使用SONAR分析代码质量 配置sonar、jenkins进行持续审查 1、Sonar介绍 Sonar是一个用于代码质量管理的开源平台,用
2023-06-03

Python中有哪些代码审查工具

本篇文章为大家展示了Python中有哪些代码审查工具,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. DeepSourceDeepSource针对各种通用编程语言(例如Python、Javascr
2023-06-08

将SCONS工具集成到Python代码中

SCONS是Python的自动智能结构化编译工具,将来或许能代替Make。    在Windows或者Linux下,SConstruct文件相当于MakeFile,使用SCONS编译,需输入scons.bat(scons),后面带上编译选项
2023-01-31

spark编程python代码分析

今天小编给大家分享一下spark编程python代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。spark编程pyth
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录