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

如何在python中识别已执行但无效的变量赋值,python,code-coverage,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]

我经常使用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,所以我们有了一个新的值”


coverage无法识别,因为分配是由代码执行的,我们无法根据所述循环按字母顺序对文件进行排序(循环更改是最有价值的地方)

您可以将
条定义为一个类的实例,该类跟踪重新分配的项目,而从未被引用过,例如,为简洁起见,可以将
dict
子类化(但最好按住a
dict
和子类
集合映射
)--还以其他方式简化了概念证明(除通过索引等方式获得外,项目还可以以其他方式“使用”):

<>这也给出了我认为的“假阳性”,例如:

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

这实际上是一种非常好的初始化
条['foo']
的方法(当然,
if/else
也很好)。但在这种情况下很难保持安静,在其他情况下也很难说话,你似乎想标记…

这可能很有用,但在我的情况下,我希望它适用于各种各样的变量(不仅仅是
BAR
)以及深度嵌套的dict(在某些情况下还包括列表/数组),我有BAR['deep']={somekey:somevalue}的情况,对于假阳性,在我的情况下,这些条件中最常用的情况在运行时不会改变,因此也不重要。当然,我们有类似于
的情况,例如BAR['foo']中的I():如果BAR['foo'][i]是某个值:…
在这种情况下,我们有时会
删除BAR['foo'][i]
,我希望在这种类型的代码中也能看到它。Ooo,阅读您提供的代码示例,它回答的是“已分配但未使用”而不是“已分配,但从未使用已分配的值/位置”(比如,当文件结束时,原来存在的东西实际上已经不存在了)…如果我有
X=1
然后有100行注释,那么
X=2
X就代码的用户而言,从技术上讲永远不会是1,但以后确实会在我的代码中使用
 BAR['foo'] = 'zap'
 if some_condition: BAR['foo'] = 'zip'