jendrikseipp/vulture

GitHub: jendrikseipp/vulture

Vulture 是一款基于 AST 的 Python 静态分析工具,用于快速发现项目中未使用的函数、类、变量和不可达代码,帮助开发者精简代码库并提升代码质量。

Stars: 4586 | Forks: 186

# Vulture - 查找死代码 [![PyPI Version](https://img.shields.io/pypi/v/vulture.svg)](https://pypi.python.org/pypi/vulture) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/vulture.svg)](https://anaconda.org/conda-forge/vulture) ![CI:Test](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/5961d99bdd022855.svg) [![Codecov Badge](https://codecov.io/gh/jendrikseipp/vulture/branch/main/graphs/badge.svg)](https://codecov.io/gh/jendrikseipp/vulture?branch=main) Vulture 查找 Python 程序中未使用的代码。这对于清理和发现大型代码库中的错误非常有用。如果你同时在一个库及其测试套件上运行 Vulture,你可以找到未被测试覆盖的代码。 由于 Python 的动态特性,像 Vulture 这样的静态代码分析器可能会遗漏一些死代码。此外,仅被隐式调用的代码也可能会被报告为未使用。尽管如此,Vulture 仍然可以作为一个非常有用的工具,帮助提升代码质量。 ## 功能 * 快速:使用静态代码分析 * 经过测试:自身测试并具有完整的测试覆盖率 * 补充 pyflakes 且具有相同的输出语法 * 使用 `--sort-by-size` 按大小对未使用的类和函数进行排序 ## 安装 ``` $ pip install vulture ``` ## 用法 ``` $ vulture myscript.py # or $ python3 -m vulture myscript.py $ vulture myscript.py mypackage/ $ vulture myscript.py --min-confidence 100 # Only report 100% dead code. ``` 提供的参数可以是 Python 文件或目录。对于每个目录,Vulture 会分析其中包含的所有 \*.py 文件。 在你找到并删除死代码之后,再次运行 Vulture,因为它可能会发现更多的死代码。 ## 未使用代码的类型 除了查找未使用的函数、类等之外,Vulture 还可以检测不可达代码。每块死代码都会被赋予一个介于 60% 到 100% 之间的*置信度值*,其中 100% 的值表示可以确定该代码不会被执行。低于 100% 的值是(基于代码块的类型)对该代码未被使用的可能性的*非常粗略*的估计。 | 代码类型 | 置信度值 | |--------------------------------------------------------|------------------| | 函数/方法/类参数,不可达代码 | 100% | | 导入 | 90% | | 属性,类,函数,方法,属性,变量 | 60% | 你可以使用 `--min-confidence` 标志来设置报告未使用代码的最低置信度。使用 `--min-confidence 100` 可以仅报告保证在分析的文件中未被使用的代码。 ## 处理误报 当 Vulture 错误地将代码块报告为未使用时,你有几种选项来抑制这些误报。如果修复你的误报也能使其他用户受益,请提交问题报告。 #### 白名单 推荐的选项是将报告为未使用的已使用代码添加到一个 Python 模块中,并将其添加到扫描路径列表中。要自动获取此类白名单,请向 Vulture 传递 `--make-whitelist`: ``` $ vulture mydir --make-whitelist > whitelist.py $ vulture mydir whitelist.py ``` 请注意,生成的 `whitelist.py` 文件将包含有效的 Python 语法,但是要让 Python 能够*运行*它,通常需要进行一些修改。 我们在 `vulture/whitelists/` 中收集了常见 Python 模块和包的白名单(欢迎提交拉取请求)。 #### 忽略文件 如果你想忽略整个文件或目录,请使用 `--exclude` 参数(例如,`--exclude "*settings.py,*/docs/*.py,*/test_*.py,*/.venv/*.py"`)。排除模式是针对绝对路径进行匹配的。 #### Flake8 noqa 注释 paths` 下指定 Vulture 应该检查的所有文件(见上文)。 还有一个 [Vulture 的 GitHub Action](https://github.com/gtkacz/vulture-action), 一个 [VS Code 扩展](https://marketplace.visualstudio.com/items?itemName=sebastienfi.dead-code-finder), 你也可以通过编程方式使用 Vulture。例如: ``` import vulture v = vulture.Vulture() v.scavenge(['.']) unused_code = v.get_unused_code() # returns a list of `Item` objects ``` ## 它是如何工作的? Vulture 使用 `ast` 模块为所有给定的文件构建抽象语法树。在遍历所有语法树时,它会记录已定义和已使用的对象的名称。之后,它会报告那些已定义但未使用的对象。此分析会忽略作用域,仅考虑对象名称。 Vulture 还通过查找 `return`、`break`、`continue` 和 `raise` 语句之后的代码,以及搜索无法满足的 `if` 和 `while` 条件来检测不可达代码。 ## 按大小排序 使用 `--sort-by-size` 选项时,Vulture 会按行数对未使用的代码进行排序。这有助于开发人员确定首先去哪里查找死代码。 ## 示例 考虑以下 Python 脚本(`dead_code.py`): ``` import os class Greeter: def greet(self): print("Hi") def hello_world(): message = "Hello, world!" greeter = Greeter() func_name = "greet" greet_func = getattr(greeter, func_name) greet_func() if __name__ == "__main__": hello_world() ``` 调用: ``` $ 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 文件。 **准备白名单** 在白名单中,我们模拟变量、属性等的使用。对于上面的程序,白名单可能如下所示: ``` # whitelist_dead_code.py from dead_code import Greeter Greeter.greet ``` 或者,你可以向 Vulture 传递 `--make-whitelist` 以获取自动生成的白名单。 将原始程序和白名单同时传递给 Vulture ``` $ vulture dead_code.py whitelist_dead_code.py ``` 会让 Vulture 忽略 `greet` 方法: ``` dead_code.py:1: unused import 'os' (90% confidence) dead_code.py:8: unused variable 'message' (60% confidence) ```