Python之深入解析Vulture如何一键找出项目中所有无效的代码

举报
Serendipity·y 发表于 2022/02/17 00:12:17 2022/02/17
1.8k+ 0 0
【摘要】 一、前言 Vulture 可以在Python程序中查找未使用的代码,这对于清理和查找大型项目(代码库)中的错误非常有用。不过由于 Python 的动态特性,像 Vulture 这样的静态代码分析器很可能...

一、前言

  • Vulture 可以在Python程序中查找未使用的代码,这对于清理和查找大型项目(代码库)中的错误非常有用。
  • 不过由于 Python 的动态特性,像 Vulture 这样的静态代码分析器很可能会遗漏一些无效代码,此外,可能会将仅被隐式调用的代码标记为未使用。
  • 尽管如此,Vulture 对于提升代码质量来说可能是一个非常有用的工具:
    • 速度快:静态代码分析;
    • 靠谱:已测试;
    • 兼容强:与 pyflies 相辅相成,具有相同的输出语法;
    • 可排序:可以按大小对未使用的类和函数进行排序 --sort-by-size;
    • 支持 Python>=3.6。

二、依赖安装

  • Windows 环境 打开 Cmd (开始-运行-CMD);
  • MacOS 环境 打开 Terminal (command+空格输入Terminal);
  • 如果使用的是 VSCode 编辑器或 Pycharm,可以直接使用界面下方的 Terminal:
pip install vulture

  
 

三、Vulture 的用法

  • 可以直接使用命令行工具运行 vulture:
vulture myscript.py # 或者
python3 -m vulture myscript.py # 或者
vulture myscript.py mypackage/ # 或者
vulture myscript.py --min-confidence 100 # 只报告100%可能的无效代码

  
 
  • 如果 vulture 没有被加进环境变量(如 Windows 系统下不会自动加到环境变量中),建议使用 python -m 的方式调用 vulture。
  • 可见,命令的参数可以是 Python 文件或目录。对于每个目录,Vulture 会分析所有包含的 *.py文件。
  • Vulture 为每个无效代码块分配一个置信度值,100% 的置信度值意味着百分百的无效代码。
  • 找到并删除无效代码后,再次运行 Vulture,因为它可能会发现更多的无效代码。
  • 举个例子,参考下述代码:
import os

class Greeter:
    def greet(self):
        print("Hi")

def hello_world():
    message = "Hello, world!"
    greeter = Greeter()
    greet_func = getattr(greeter, "greet")
    greet_func()

if __name__ == "__main__":
    hello_world()

  
 
  • 调用 vulture:
vulture dead_code.py
# 或者
python -m vulture dead_code.py

  
 
  • 输出效果如下:
dead_code.py:1: unused import 'os' (90% confidence)
dead_code.py:4: unused function 'greet' (60% confidence)
dead_code.py:8: unused variable 'message' (60% confidence)

  
 
  • Vulture 正确地将“os”和“message”报告为未使用,但未能检测到实际使用了“greet”。处理此类误报的推荐方法是创建一个白名单 Python 文件。

四、处理误报

  • 当 Vulture 错误地将代码块报告为未使用时,有多种选择来抑制误报。
  • 如果修复误报也可以使其它用户受益,请提交问题报告。

① 白名单

  • 推荐的选项是将报告为“未使用的”已使用代码添加到 Python 模块,并将其添加到扫描路径列表中。要自动获取这样的白名单,请传递 --make-whitelist 给 Vulture:
vulture mydir --make-whitelist > whitelist.py
vulture mydir whitelist.py

  
 
  • 请注意,生成的 whitelist.py 文件将包含有效的 Python 语法,但为了让 Python 能够运行它,通常需要进行一些修改。

② 忽略文件

  • 如果要忽略整个文件或目录,请使用 --exclude 参数如 --exclude *settings.py,docs/ 。

③ Flake8 noqa 注释

  • 为了与 flake8 兼容,Vulture 支持 F401 和 F841错误代码以忽略未使用的导入 ( # noqa: F401 ) 和未使用的局部变量 ( # noqa: F841 )。
  • 但是,建议使用白名单而不是 noqa 注释,因为 noqa 注释会给代码增加视觉干扰并使其更难阅读。

④ 忽略名称

  • 还可以使用 --ignore-names foo*,ba[rz] 让 Vulture 忽略所有以 foo 开头的及 bar 和 baz 的名称。
  • 此外,–ignore-decorators 选项可用于忽略用给定装饰器装饰的函数。这在 Flask 项目中很有帮助,可以在其中使用装饰器 --ignore-decorators “@app.route” 忽略所有 @app.route 函数。
  • 建议使用白名单代替 --ignore-names 或 --ignore-decorators ,因为白名单在传递给 Vulture 时会自动检查语法正确性。

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/120873050

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。