python vulture
## Python Vulture专治代码“僵尸”的实用工具1. 他是什么写代码时间长了手头都会积攒不少“僵尸代码”比如某个函数一开始定义的参数后来压根没用上或者当初为了调试写的一堆 import最后却忘了删。这些死代码就像冰箱里放久了的剩菜不仅占地方还容易让后来接手的人莫名其妙。Vulture 就是专门干这个的——一个能自动检测 Python 项目里“无用代码”的小工具。它的核心逻辑其实挺笨的先把代码里所有定义的东西变量、函数、类、参数等等都扫一遍搞清楚每个符号从哪里定义、在哪里被引用。如果一个定义从头到尾都没被调用过那就判定为“死代码”。这种思路和编译器里的死代码删除Dead Code Elimination有点像只不过 Vulture 是基于静态分析不执行代码就能分析的。2. 他能做什么说两个实际的场景。第一个是你维护一个旧项目代码写了快两年中途换过几次人。每个人往里加东西但很少清理。这时候项目里很可能藏着几十个废弃的函数甚至还有整个模块都没人用。Vulture 跑一遍能把这些“僵尸”揪出来。第二个场景是重构。比如把某个类里的方法重构后旧的方法没删干净但新的逻辑已经不用了。Vulture 很擅长抓到这种“漏网之鱼”。它能检测到的东西包括没用的 import比如导入了os但代码里压根没用os.path之类的没被调用的函数和方法包括 private 方法没被实例化的类没被用到的变量包括全局变量和局部变量有一个比较隐蔽的例子你定义了一个属性self._cache {}但后面的代码里既没读它也没写它。Vulture 能抓到这种而有时候人眼反而会漏掉。3. 怎么使用安装很简单pip 或者 poetry 都行pipinstallvulture最基础的使用vulture myproject/这会扫描整个项目目录返回类似这样的报告myproject/utils.py:10: unused variable result (60% confidence) myproject/module.py:100: unused function old_parser (60% confidence)注意那个 confidence 值置信度这是 Vulture 的一个特点——它也不确定某些东西是不是真的没用。比如一个类可能只在运行时通过名称动态调用静态分析看不到调用链就会误报。这时候就需要人工判断。如果想减少误报可以用--min-confidence参数比如只显示置信度 80% 以上的结果vulture myproject/ --min-confidence80比较实用的方法是把 Vulture 的检测结果输出到文件然后手动标记哪些是真实问题vulture myproject/vulture_output.txt然后手动编辑这个文件去掉那些误报的行剩下就是真正要删的代码。或者直接在 Vulture 的配置里加入白名单whitelist文件把正确的“假阳性”列进去后面每次跑 Vulture 都会自动过滤。4. 最佳实践不要一次性全删。这是新手最容易犯的错。Vulture 是静态分析会漏掉动态调用的情况。比如一个函数可能通过getattr(obj, func_name)被调用Vulture 通常检测不到。所以最佳做法是分三步第一步跑一次 Vulture把输出记下来。第二步人肉检查每个可疑项确认是不是真没用。有些明显是废弃接口的函数可以放心删但那些命名像_internal_handler之类的建议保守一点先查查是不是被导入到了其他地方。第三步确认后先在测试环境里删一段跑一遍测试用例单元测试、集成测试如果没有报错再批量删。搭配测试覆盖率工具一起用。Vulture 负责清理“从来不用的代码”测试覆盖率工具比如 coverage.py负责检查“代码跑没跑过”。这两者结合基本能覆盖常见的死代码问题。不过 coverage.py 关注的是执行路径Vulture 关注的是定义与调用关系所以不太冲突。建立定期清理习惯。可以每季度或者每次大版本发布前跑一次 Vulture。这活儿不费事但能让代码库保持整洁。给项目加一个 CI 定时任务跑 Vulture 并生成报告然后人工审查比一次性清理几十个废弃函数轻松得多。5. 和同类技术对比同类工具有不少比如PyFlakes也能检测未使用变量和未使用的 import但它比 Vulture 更激进一些。PyFlakes 会认为一个只定义没调用的函数就是问题而 Vulture 允许这类情况存在比如一个模块提供了公共 API可能只导出但不调用。Vulture 的置信度机制让它更灵活。Pylint全能选手能检查代码风格、错误、未使用变量。但它的死代码检测比较粗放比如未使用的变量能抓到但未使用的类和方法就不太行。Pylint 的优势是代码质量 lint 全覆盖Vulture 专注在死代码一个点上可能更专精。Deadcode少见这是一个专门检测 Python 死代码的小工具实现原理根 Vulture 类似但社区更小更新频率不如 Vulture 频繁。Vulture 胜在活跃度高、文档齐全。手动审查代码审查是最底层的方案但人力有限。一个中等规模项目可能有几千行代码肉眼很难找出隐藏的死代码。Vulture 相当于给了一个“省力杠杆”。Vulture 最值得用的地方在于它的置信度机制让我们可以过滤掉一部分噪音。而同类工具里PyFlakes 适合追求干净到极致的做法见不得任何未使用的代码但需要接受一些误报。如果团队比较保守Vulture 是更稳妥的选择。最后说一点个人习惯我一般会写一个whitelist.py文件放在项目根目录把那些“的确定义了但不直接调用”的代码列进去。比如注册路由的装饰器、通过字符串调用的工厂函数。这样 Vulture 跑完就知道哪些是真死代码哪些是故意为之。