如何找到Python代码中未使用的函数?

问题描述 投票:0回答:7

因此,您在一个相当庞大的项目中存在一些遗留代码。如何找到并删除死函数?

我看过这两个参考文献:查找未使用的代码在 php 项目中查找未使用的函数的工具,但它们似乎分别特定于 C# 和 PHP。

是否有一个 Python 工具可以帮助您找到源代码中其他任何地方都没有引用的函数(尽管存在反射/等)?

python refactoring dead-code
7个回答
163
投票

在Python中,您可以使用动态或静态代码分析器找到未使用的代码。动态分析器的两个示例是

coverage
figleaf
。它们的缺点是您必须运行代码的所有可能分支才能找到未使用的部分,但它们也有一个优点,即您可以获得非常可靠的结果。

或者,您可以使用静态代码分析器,它只查看代码,但不实际运行它。它们运行得更快,但由于 Python 的动态特性,结果可能包含误报。 此类别中的两个工具是

pyflakes
vulture
。 Pyflakes 查找未使用的导入和未使用的局部变量。 Vulture 可以找到各种未使用和无法访问的代码。 (完全披露:我是 Vulture 的维护者。)

这些工具可在 Python 包索引 https://pypi.org/ 中找到。


14
投票

另一个选项是 deadcode Python 包。它检测全局定义但未使用的变量、函数和类名称。该工具用作静态代码检查器:它首先解析所有全局定义的名称,然后计算它们在整个代码库中被引用的次数。

您可以安装它:

pip install deadcode

并运行它

deadcode .

我已经实现了这个工具,因为其他工具没有为我完成这项工作。使用 deadcode 作为 CI/CD 管道的一部分应该很方便。我希望它有帮助。


3
投票

由于 Python 代码的呈现方式相当严格,基于正则表达式来构建查找

def function_name(..)
的函数列表会那么困难吗?

然后搜索每个名称并计算它在代码中出现的次数。它自然不会考虑注释,但只要您查看少于两个或三个实例的函数...

这有点斯巴达式,但听起来像是一个不错的周末任务 =)


3
投票

我不确定这是否有帮助,但您可以尝试使用 coveragefigleaf 或其他类似模块,它们记录您实际运行脚本/应用程序时使用源代码的哪些部分。


2
投票

除非您知道您的代码使用反射,正如您所说,否则我会选择一个简单的 grep。不要低估 vim 中星号的力量(对文件中光标下的单词进行搜索),尽管这仅限于您当前正在编辑的文件。

您可以实现的另一个解决方案是拥有一个非常好的测试套件(不幸的是,很少发生),然后用弃用例程包装例程。如果您得到弃用输出,则意味着该例程已被调用,因此它仍在某处使用。这甚至适用于反射行为,但当然,您永远无法确定在执行例程调用时是否不会触发这种情况。


0
投票

不仅搜索函数名称,还搜索所有未使用的导入包。 您需要搜索所有导入的包(包括别名)的代码并搜索使用的函数,然后从每个包创建特定导入的列表(示例而不是 import os,替换为 from os import listdir, getcwd,... ...)


0
投票

在我的项目文件夹中,包含 89 个文件。 我创建了一个名为used.py的新文件 在该文件中,我添加了以下内容:

# Why can't I find a tool that detects this file is not used ?
# 

print("Nothing")

Vulture 没有找到此文件。

© www.soinside.com 2019 - 2024. All rights reserved.