首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别python中已执行但已死的变量赋值。

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

Stack Overflow用户
提问于 2015-01-15 00:20:26
回答 1查看 78关注 0票数 2

我经常使用像pyflakes和pep8之类的工具,以及覆盖率/工作服等。但是在我的项目中,我们有一些1000+行文件,包括以下内容

代码语言:javascript
复制
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,所以我们为它提供了一个新的值”。

覆盖率无法识别,因为分配是执行代码的,我们不能按字母顺序排序文件,因为所述循环(而循环更改是这个值最多的地方)。

EN

回答 1

Stack Overflow用户

发布于 2015-01-15 00:30:30

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

代码语言:javascript
复制
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()

在以下情况下,我认为这也是一种“假阳性”:

代码语言:javascript
复制
 BAR['foo'] = 'zap'
 if some_condition: BAR['foo'] = 'zip'

这实际上是初始化BAR['foo']的一种非常好的方法(当然,if/else也很好)。但在这种情况下很难保持沉默,在其他情况下你也很难大声说话.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27954897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档