在大型python proj中查找死代码

2024-05-21 06:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我见过How can you find unused functions in Python code?但那真的很老了,不能回答我的问题。

我有一个大型python项目,它有多个库,这些库由多个入口点脚本共享。这个项目已经与许多作者合作多年,所以有很多死代码。你知道训练。

我知道找到所有死代码是不可判定的。我所需要的是一个工具,它可以找到所有在任何地方都没有调用的函数。我们对基于函数名字符串调用函数没有任何兴趣,所以我不担心任何病态的。。。

我刚刚安装了pylint,但它似乎是基于文件的,并且没有太多关注文件间的依赖,甚至函数依赖。

很明显,我可以在所有文件中对def进行grep,从中获取所有函数名,并对每个函数名进行grep。我只是希望已经有比这更聪明的东西了。

埃塔:请注意,我并不期望或想要完美的东西。我和任何人一样知道我的停止问题证明(不,我教的是计算理论,当我在看递归可数的东西时我就知道了)。任何试图通过实际运行代码来近似它的事情都会花费太长的时间。我只想要一些语法上经过代码的东西,并说“这个函数肯定被使用了。这个函数可能会被使用,而这个函数肯定不会被使用,其他人似乎都不知道它的存在!”前两类并不重要。


Tags: 文件项目函数代码in脚本youunused
3条回答

你可能想试试vulture。由于Python的动态特性,它不能捕获所有内容,但它捕获了相当多的内容,而不需要像coverage.py这样的完整测试套件,其他测试套件也需要工作。

尝试运行Ned Batcheldercoverage.py

Coverage.py is a tool for measuring code coverage of Python programs. It monitors your program, noting which parts of the code have been executed, then analyzes the source to identify code that could have been executed but was not.

在不执行代码的情况下,很难确定调用了哪些函数和方法,即使代码没有做任何花哨的事情。简单的函数调用很容易被检测到,但是方法调用确实很难。举个简单的例子:

class A(object):
    def f(self):
        pass

class B(A):
    def f(self):
        pass

a = []
a.append(A())
a.append(B())
a[1].f()

在这里没有什么特别之处,但是任何试图确定是否调用A.f()B.f()的脚本在不实际执行代码的情况下都很难这样做。

虽然上面的代码没有做任何有用的事情,但它确实使用了出现在实际代码中的模式——即将实例放入容器中。真正的代码通常会做更复杂的事情——挑选和取消挑选、分层数据结构、条件。

如前所述,只需检测表单的普通函数调用

function(...)

或者

module.function(...)

会很容易的。您可以使用ast模块来分析源文件。您需要记录所有导入,以及用于导入其他模块的名称。您还需要跟踪顶级函数定义和这些函数内部的调用。这将为您提供一个依赖关系图,您可以使用NetworkX来检测此图的连接组件。

虽然这听起来可能相当复杂,但可能只需不到100行代码就可以完成。不幸的是,几乎所有主要的Python项目都使用类和方法,因此它没有什么帮助。

相关问题 更多 >