【问题标题】:How can you find unused functions in Python code?如何在 Python 代码中找到未使用的函数?
【发布时间】:2010-10-16 03:17:45
【问题描述】:

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

我见过这两个参考资料:Find unused codeTool to find unused functions in php project,但它们似乎分别特定于 C# 和 PHP。

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

【问题讨论】:

    标签: python refactoring dead-code


    【解决方案1】:

    在 Python 中,您可以使用动态或静态代码分析器查找未使用的代码。动态分析器的两个示例是coveragefigleaf。它们的缺点是您必须运行代码的所有可能分支才能找到未使用的部分,但它们还有一个优点是您可以获得非常可靠的结果。

    或者,您可以使用静态代码分析器,它只查看您的代码,但不实际运行它。它们运行得更快,但由于 Python 的动态特性,结果可能包含误报。 此类别中的两个工具是pyflakesvulture。 Pyflakes 查找未使用的导入和未使用的局部变量。 Vulture 会发现各种未使用和无法访问的代码。 (全面披露:我是 Vulture 的维护者。)

    Python 包索引https://pypi.org/ 中提供了这些工具。

    【讨论】:

    • 秃鹫+1。我只是 pip 安装了它,在我的目录上运行它,它给出了我正在寻找的输出。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我有我的 Vim 配置定义键“g”(即按逗号然后按 g,逗号是用户定义键的 Vim 约定)在代码库中运行“grep”在光标下的单词上。它实际上调用了我的 ~/bin/grp 脚本,它使用一些预定义的 '--exclude' 和 '--exclude-dir' 调用 grep - 这样我的命令行 greps 给出的结果与我的 in-Vim greps 相同.我定义了“grp”一次,实际上是在几十年前,并且从那以后对其进行了一次或两次调整。比 awk 快,和 ag 一样快,根据情况给予或接受。
      • 说了这么多,我不建议将其作为对 OP 的回答。您不想定期进行大量手动搜索(每个功能一个)。我很失望 pylint 没有涵盖它,所以我要去看看秃鹰等提供的东西。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        由于 python 代码的呈现方式相当严格,因此基于正则表达式来构建函数列表是否会很困难以查找 def function_name(..)

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-15
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 2021-09-28
          • 1970-01-01
          • 2019-01-08
          相关资源
          最近更新 更多