Vulture 可以在Python程序中查找未使用的代码。这对于清理和查找大型项目(代码库)中的错误非常有用。
不过由于Python的动态特性,像 Vulture 这样的静态代码分析器很可能会遗漏一些无效代码,此外,可能会将仅被隐式调用的代码标记为未使用。
尽管如此,Vulture对于提升代码质量来说可能是一个非常有用的工具。
1.功能
- FAST:静态代码分析
- 已测试
- 与pyflies相辅相成,具有相同的输出语法
- 可以按大小对未使用的类和函数进行排序
--sort-by-size
- 支持Python>=3.6
2.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:
pip install vulture
3.用法
你可以直接使用命令行工具运行 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 文件。见下面第四点。
4.处理误报
当 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 时会自动检查语法正确性。
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典