Python循环在第一次传递后中断

2024-05-19 00:00:58 发布

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

我有一个函数,它包含一个while循环,在第一次传递后中断:

def format_sites(self, query_data):
    # Convert the list of tuples to a list of dictionaries
    self.query_data = query_data
    self.x = 0
    self.site_list = list()
    self.site_dict = dict()
    while self.x < len(self.query_data):
        self.site_dict['site_id'] = self.query_data[self.x][0]
        self.site_dict['title'] = self.query_data[self.x][1]
        self.site_dict['subtitle'] = self.query_data[self.x][2]
        self.site_dict['type'] = "menu"

        self.site_dict['options'] = self.format_devices(DBHandler(Query().query_single_site(self.query_data[self.x][0])).rows)

        self.site_list.append(self.site_dict.copy())
        self.x += 1

    return self.site_list

我知道行self.site_dict['options'] = self.format_devices(DBHandler(Query().query_single_site(self.query_data[self.x][0])).rows)是导致问题的原因,因为当我删除它时,一切正常,但我的字典中缺少了options键。你知道吗

更深入一点的信息。。。此函数从PSQL查询中获取站点列表,并将其格式化为用于构建菜单的字典语法。为了获得为每个“site option”构建的子菜单,我需要将我的子菜单项列表作为与options键相关联的值。现在,format_devices()自己运行得很好(我调用这个函数是为了一个列出我所有设备的菜单)。另外,我从另一个模块中调用的变量format_sites()复制了self.format_devices(DBHandler(Query().query_single_site(self.query_data[self.x][0])).rows)的大部分语法。我唯一能想到的是,不知何故,return self.device_list结尾的format_devices()可能是导致循环结束的原因。你知道吗

请原谅任何糟糕的格式,因为我用这个程序来真正学习Python。你知道吗

如果有其他部分的代码你需要看到,以便更好地回答这个问题,请让我知道。它来自相当多不同的模块,我认为这可能是太多多余的职位。你知道吗


Tags: 函数selfformatdata菜单sitequerydict
2条回答

而不是这个

while self.x < len(self.query_data):
   pass

与C或Java不同,一个好的pythonic解决方案将使用enumerate:

>>> listy = ['a','b','c']
>>> for idx, val in enumerate(listy):
>>>     print 'listy[{}] is {}'.format(idx, val)
listy[0] is a
listy[1] is b
listy[2] is c

所以我们没有format\u设备的代码,但我怀疑问题是format\u设备在执行此操作时会迭代某些结构并修改self.x。如果这个猜想是正确的,那么它就解释了循环过早终止的原因;当第一个format\u设备调用时,self.x是零,但format\u data修改self.x,当它返回时,self.x比零大得多。如果大于查询数据的长度,则循环终止。如果是这种情况,那么解决方法是将format\u data和format\u sites中的self.x都更改为x,从而使循环计数器函数的作用域更大。你知道吗

这在代码中的其他地方也是一个问题-没有理由使对象具有作用域self.query\u数据变量,norself.site\u列表,也不是self.dict\u列表. 这些可以是查询数据、站点列表和目录列表。使用self.foo文件,您引用的是对象上的字段foo,而不是本地作用域为单个函数的临时变量,以及self.foo文件的状态将在对同一方法的多个调用(甚至其他也引用self.foo文件).

相关问题 更多 >

    热门问题