首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在大型python项目中查找死代码

在大型python项目中查找死代码
EN

Stack Overflow用户
提问于 2012-03-02 06:03:07
回答 5查看 22.7K关注 0票数 76

我见过How can you find unused functions in Python code?,但它太老了,并没有真正回答我的问题。

我有一个大型python项目,其中包含多个库,这些库由多个入口点脚本共享。这个项目已经积累了很多年,有很多作者,所以有很多死代码。你知道该怎么做。

我知道找出所有的死代码是无法决定的。我所需要的是一个工具,它可以找到任何地方都没有调用的所有函数。我们不会根据函数名的字符串调用函数,所以我不担心任何病态的事情……

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

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

ETA:请注意,我并不期望或想要完美的东西。我知道我的停顿问题证明就像任何人一样(不,真的,我教的是计算理论,当我看到递归可枚举的东西时,我知道)。任何试图通过实际运行代码来近似它的事情都会花费太长的时间。我只想要一些在语法上通过代码并告诉我“这个函数肯定被使用了,这个函数可能会被使用,这个函数肯定没有被使用,甚至没有人知道它的存在!”前两个类别并不重要。

EN

回答 5

Stack Overflow用户

发布于 2013-08-14 22:17:47

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

票数 43
EN

Stack Overflow用户

发布于 2012-03-03 00:58:17

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

代码语言:javascript
复制
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()的脚本在没有实际执行代码的情况下都会遇到相当困难的情况。

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

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

代码语言:javascript
复制
function(...)

代码语言:javascript
复制
module.function(...)

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

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

票数 9
EN

Stack Overflow用户

发布于 2012-03-03 00:13:44

以下是我至少试探性地使用的解决方案:

代码语言:javascript
复制
grep 'def ' *.py > defs
# ...
# edit defs so that it just contains the function names
# ...
for f in `cat defs` do
    cat $f >> defCounts
    cat *.py | grep -c $f >> defCounts
    echo >> defCounts
done

然后我看一下引用很少的各个函数(< 3)

它很难看,而且它只给了我大致的答案,但我认为它足以作为一个开始。你是什么-所有人的想法?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9524873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档