如何在python中识别已执行但已死的变量赋值

时间:2015-01-15 00:20:27

标签: python code-coverage

我经常使用像pyflakes和pep8这样的工具,以及覆盖/工作服等。但在我的项目中,我们有一些1000多个行文件,其中包括

FOO = 3
BAR['foo'] = 5   # Actually overwritten/dead-code
BAR['bat'] = 6
BAR['bazooka']['aimed'] = True  # Actually Overwritten/dead-code
for i in BAR['bazooka'].keys():
    BAR['bazooka'][i] = False
if not BAR['bazooka']['aimed']:
    BAR['foo'] = 500

等,在同一个文件中,我们还有一些东西试图用for循环做聪明的事情,并根据一些其他变量替换部分dict堆栈。

我感兴趣的是,如果python有任何方式(执行时很好,但无需修改每个var赋值),那么“第3行的分配实际上已被覆盖了在第398行的循环中分配

基本上一种方式“好了,这里指定的变量是gc()'d所以我们有一个新值”

覆盖无法识别因为分配是执行代码,我们无法按字母顺序对文件进行排序(并且循环更改是最有价值的地方)

1 个答案:

答案 0 :(得分:0)

例如,您可以将BAR定义为类的实例,该类跟踪重新分配的项目,而不会被引用。为了简洁而对dict进行子类化(但最好是保持 a dict和子类collections.Mapping) - 这也是其他方式的简化概念证明(项目可能是“以其他方式使用”,而不仅仅是通过索引等获得):

class Bardict(dict):

    def __init__(*a, **k):
        dict.__init__(self, *a, **k)
        self.assigned_not_used = set(self)

    def __getitem__(self, key):
        self.assigned_not_used.discard(key)
        return dict.__getitem__(self, key)

    def __setitem__(self, key, value):
        if key in self.assigned_not_used:
            print('Assigned, never used: {}'.format(key)
        self.assigned_not_used.add(key)
        return dict.__setitem__(self, key)

 BAR = Bardict()

在以下情况下,这也给出了我认为是“假阳性”的内容:

 BAR['foo'] = 'zap'
 if some_condition: BAR['foo'] = 'zip'

这实际上是初始化BAR['foo']的完美方式(当然,if/else也很好)。但是在这种情况下很难保持安静,并且在其他情况下说出你似乎想要标记......

相关问题