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

2024-09-29 17:09:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常使用像pyflakes和pep8这样的工具,以及coverage/工作服等,但是在我的项目中,我们有一些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(),所以我们有了一个新的值”

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


Tags: 文件工具forfoocoveragebarcodepyflakes
1条回答
网友
1楼 · 发布于 2024-09-29 17:09:41

例如,您可以将BAR定义为一个类的实例,该类跟踪在没有被引用的情况下重新分配了哪些项。为了简洁起见,子类化dict(但最好是保持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也可以)。但在这种情况下很难保持沉默,在其他情况下也很难大声说出来,你似乎想打旗子。。。你知道吗

相关问题 更多 >

    热门问题