首次传递后Python循环中断

时间:2017-02-22 02:48:22

标签: 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查询中获取一个站点列表,并将其格式化为我用来构建菜单的字典语法。为了获得为每个&#34;站点选项&#34;构建的子菜单,我需要将子菜单项列表作为与options键关联的值。现在,format_devices()可以自行运行(我将此函数称为列出所有设备的菜单)。另外,我从我必须在另一个模块中调用self.format_devices(DBHandler(Query().query_single_site(self.query_data[self.x][0])).rows)的变量复制了format_sites()的大部分语法。我唯一能想到的是,不知何故,return self.device_list末尾的format_devices()可能是导致循环结束的原因。

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

如果您需要查看其他部分代码以便更好地回答问题,请告知我们。它来自相当多的不同模块,我认为发布可能过多。

2 个答案:

答案 0 :(得分:0)

而不是这个

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

与C或Java不同,一个不错的pythonic解决方案将使用枚举:

>>> 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

答案 1 :(得分:0)

所以我们没有format_devices的代码,但我怀疑问题是format_devices迭代某些结构并修改self.x同时这样做。如果这个猜想是正确的,那么它解释了循环的提前终止;当第一个format_devices调用时,self.x为零,但format_data修改self.x,当它返回时,self.x远大于零。如果它大于query_data的长度,则循环终止。如果是这种情况,那么修复就是在format_data和format_sites 中将self.x更改为x,从而使循环计数器具有功能范围。

这也是此代码中其他地方的问题 - 没有理由创建一个对象范围的self.query_data变量,也没有自制.site_list和self.dict_list。这些可能只是query_data,site_list和dict_list。 当你使用self.foo时,你在一个对象上引用一个字段foo,而不是一个本地范围内的一个瞬态变量到一个函数,并且self.foo的状态将持续多次调用相同的方法(甚至其他方法也引用self.foo)。