我经常使用像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是否有任何方法(at-execution很好,但不需要修改每个var赋值),比如“第3行的赋值实际上被第398行循环中的赋值覆盖了)。”
基本上是这样的一种方式:“这里赋值的变量是gc()d,所以我们为它提供了一个新的值”。
覆盖率无法识别,因为分配是执行代码的,我们不能按字母顺序排序文件,因为所述循环(而循环更改是这个值最多的地方)。
发布于 2015-01-15 00:30:30
例如,您可以将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也很好)。但在这种情况下很难保持沉默,在其他情况下你也很难大声说话.
https://stackoverflow.com/questions/27954897
复制相似问题