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

89
6个回答

134
在Python中,您可以使用动态或静态代码分析器查找未使用的代码。两个动态分析器的示例是coveragefigleaf。它们的缺点是您必须运行代码的所有可能分支才能找到未使用的部分,但它们的优点是您会得到非常可靠的结果。
另外,您可以使用静态代码分析器仅查看您的代码,但不实际运行它。它们运行速度更快,但由于Python的动态性质,结果可能包含误报。 该类别中的两个工具是pyflakesvulture。Pyflakes可以找到未使用的导入和未使用的本地变量。Vulture可以找到各种未使用和无法访问的代码。(完全披露:我是Vulture的维护人员。)
这些工具在Python Package Index中https://pypi.org/可用。

20
对秃鹫点个赞。我刚刚使用pip安装了它,在我的目录上运行,得到了我想要的输出。 - Jonathan Hartley
1
刚刚安装了vulture,我非常喜欢它!Rust默认内置了未使用代码警告,这是我在Python中一直想念的。我特别喜欢vulture显示的置信度!像你这样的开发者让世界变得更美好 :-)。 - Sylvester Kruin
我先运行 vulture,然后再运行 coverage - ishandutta2007
太棒了!我一直在寻找像“秃鹰”这样的东西。 - Inertial Ignorance
太棒了!我一直在寻找像“秃鹰”这样的东西。 - undefined

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

运行它
deadcode .

我已经实施了这个工具,因为其他的工具对我来说没有起到作用。将deadcode作为CI/CD流程的一部分使用应该很方便。希望能有所帮助。

刚刚试了一下vulturevulture检测到了deadcode错过的未使用的变量。不管怎样,这是个不错的工具。 - undefined

4

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


3
由于Python代码的呈现方式相当严格,基于正则表达式构建函数列表会很困难,你认为呢?然后搜索每个函数名并计算其在代码中出现的次数。这种方法自然不会考虑注释,但只要您查看具有少于两到三个实例的函数即可...... 这听起来有点简陋,但听起来像一个愉快的周末任务 =)

2

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

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


我有我的Vim配置定义了键“<Leader>g”(即按逗号然后按g,逗号是Vim约定的用户定义键)以在光标下的单词上运行“grep”跨代码库。它实际上调用了我的~/bin/grp脚本,该脚本使用一些预定义的“--exclude”和“--exclude-dir”调用grep,以便我的命令行grep与我的Vim grep给出相同的结果。我曾经定义过“grp”,大约几十年前,并在此之后进行了一两次调整。比awk更快,与ag一样快,具体取决于情况。 - Jonathan Hartley
1
说了这么多,我不建议将此作为对OP的答案。您不想经常进行许多大型手动搜索(每个函数一个)。我很失望pylint没有涵盖它,所以我要看看vulture等工具能提供什么。 - Jonathan Hartley

0

这不仅仅是搜索函数名称,还包括所有未使用的导入包。 您需要搜索代码中所有已导入的包(包括别名)和使用的函数,然后创建每个包的特定导入列表(例如,将import os替换为from os import listdir、getcwd等)。


这是在处理单个或双文件项目时可以使用的一种不错的技术,但正如OP所述,他们正在寻找适用于“相当庞大”的项目的解决方案。因此,自己查找和跟踪所有未使用的变量、函数和模块导入太过繁琐和耗时。 - Sylvester Kruin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接