我见过How can you find unused functions in Python code?但那真的很老了,不能回答我的问题。
我有一个大型python项目,它有多个库,这些库由多个入口点脚本共享。这个项目已经与许多作者合作多年,所以有很多死代码。你知道训练。
我知道找到所有死代码是不可判定的。我所需要的是一个工具,它可以找到所有在任何地方都没有调用的函数。我们对基于函数名字符串调用函数没有任何兴趣,所以我不担心任何病态的。。。
我刚刚安装了pylint,但它似乎是基于文件的,并且没有太多关注文件间的依赖,甚至函数依赖。
很明显,我可以在所有文件中对def进行grep,从中获取所有函数名,并对每个函数名进行grep。我只是希望已经有比这更聪明的东西了。
埃塔:请注意,我并不期望或想要完美的东西。我和任何人一样知道我的停止问题证明(不,我教的是计算理论,当我在看递归可数的东西时我就知道了)。任何试图通过实际运行代码来近似它的事情都会花费太长的时间。我只想要一些语法上经过代码的东西,并说“这个函数肯定被使用了。这个函数可能会被使用,而这个函数肯定不会被使用,其他人似乎都不知道它的存在!”前两类并不重要。
你可能想试试vulture。由于Python的动态特性,它不能捕获所有内容,但它捕获了相当多的内容,而不需要像coverage.py这样的完整测试套件,其他测试套件也需要工作。
尝试运行Ned Batchelder的coverage.py。
在不执行代码的情况下,很难确定调用了哪些函数和方法,即使代码没有做任何花哨的事情。简单的函数调用很容易被检测到,但是方法调用确实很难。举个简单的例子:
在这里没有什么特别之处,但是任何试图确定是否调用
A.f()
或B.f()
的脚本在不实际执行代码的情况下都很难这样做。虽然上面的代码没有做任何有用的事情,但它确实使用了出现在实际代码中的模式——即将实例放入容器中。真正的代码通常会做更复杂的事情——挑选和取消挑选、分层数据结构、条件。
如前所述,只需检测表单的普通函数调用
或者
会很容易的。您可以使用
ast
模块来分析源文件。您需要记录所有导入,以及用于导入其他模块的名称。您还需要跟踪顶级函数定义和这些函数内部的调用。这将为您提供一个依赖关系图,您可以使用NetworkX来检测此图的连接组件。虽然这听起来可能相当复杂,但可能只需不到100行代码就可以完成。不幸的是,几乎所有主要的Python项目都使用类和方法,因此它没有什么帮助。
相关问题 更多 >
编程相关推荐