python,如何检测在类中定义但从未被类实例调用的属性或函数?

时间:2016-02-24 02:23:02

标签: python python-2.7

如您所知,当项目的代码非常大并且在类中定义了如此多的属性和函数时,其中一些属性和函数永远不会被类的实例调用,也许其中一些已被丢弃。这是一个例子:

class Foo(object):
    """"""
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3
        ...
        self.y = 25
        self.z = 26

    def func1(self):
        pass

    def func2(self):
        pass

    def func3(self):
        pass
    ...
    ...
    def func100(self):
        pass

if __name__ == '__main__':
    f = Foo()
    f.func1()
    f.func2()
    print f.a, f.b, f.z

在上面的代码中,类 Foo 的实例 f 刚刚调用 func1() func2()。以及如何查找从未被类实例调用的类的所有属性和函数。

我尝试了compiler模块,但这无法解决我的问题。而dir(my_instance)只是打印定义该类的所有函数和属性。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试coverage.py。这不是静态分析,而是实际运行你的代码并记录执行哪些语句,输出带注释的html或txt(你也可以很好地格式化)。然后,您可以查找其主体未执行的函数和方法。

这仍然不会处理未使用的属性。我不知道答案。也许可以一次一个地评论它们,看看测试是否仍然通过......

答案 1 :(得分:0)

很难证明在一般情况下使用或不使用某些内容。 Python是一种动态语言;如果即使一位代码调用代码,静态分析器也不能完全分析,它可能正在访问所提到的变量。

pylintflake8工具会告诉您在使用之前未定义的本地和全局名称(除非您使用from x import *样式导入来破坏它们),以及从未使用过的导入(从未使用的导入通常是错误的,但即便如此,它也可能是界面的有意识部分,其中必须保持沉默),但我不相信他们可以告诉你永远不会访问给定的属性;毕竟,其他人可以导入您的模块并访问所述属性。

答案 2 :(得分:0)

使用标准库中的profile模块。

python -m cProfile -o output_file myscript.py

然后加载stats文件并使用print_callees()来获取在该程序运行期间调用的所有函数。

我不知道找出使用哪些属性的简单方法。