在python

时间:2017-02-14 23:11:13

标签: python dictionary

我是Python新手,我正在尝试使用flask构建一个简单的REST api。 我不明白为什么会导致错误:

boxes = {}
counter = 1
for box in ListOfBoxes:

    boxes['boxes'][counter]['ID']= box.ID
    boxes['boxes'][counter]['name']= box.name 
    boxes['boxes'][counter]['state']= box.state
    boxes['boxes'][counter]['directory']= box.directory
    boxes['boxes'][counter]['provider']= box.provider
    counter +=1 

return jsonify(boxes)

虽然这有效:

boxes = {}
counter = 1
for box in ListOfBoxes:

    boxes['boxes'] = {}
    boxes['boxes'][counter] = []
    boxes['boxes'][counter].append({'ID': box.ID, 'name':box.name, 'state': box.state, 'directory': box.directory, 'provider': box.provider})
    counter +=1 

return jsonify(boxes)

错误是:

    File "./flask/app.py", 
line 16, in get_boxes boxes['boxes'][counter]['ID']= box.ID KeyError: 'boxes'

当谷歌搜索和stackoverflowing寻找答案时,大多数情况下使用第二段代码。至少这是我从中理解的。

3 个答案:

答案 0 :(得分:1)

问题是boxes 不包含密钥'boxes'。既然你在这里**没有设置boxes['boxes'],但你得到了元素,并对该元素执行操作。

解决问题的方法当然是立即在字典boxes中插入带有该键的元素,所以:

boxes = {'boxes':[]}

尽管如此,这仍然不够,因为再次boxes['boxes'][counter]对该对象执行操作。所以,你将不得不构建一个字典。

然而,您可以使用 list-comprehension 字典文字优雅地重写代码:

result = [{'ID': box.ID,'name':box.name,'state':box.state,
           'directory':box.directory,'provider':box.provider}
          for box in ListOfBoxes]
boxes = {'boxes':result}
return jsonify(boxes)

如果box对象仅包含上述字段,您甚至可以使用以下 one-liner

return jsonify({'boxes':[box.__dict__ for box in ListOfBoxes]})

因为__dict__是对象的字典(包含映射到其值的字段的名称)。但这仅在上述条件下有效。

答案 1 :(得分:1)

实现默认树的一种简单方法是使用defaultdict

myfunc

然后:

from collections import defaultdict

def Tree():
    return defaultdict(Tree)

答案 2 :(得分:0)

在第一个示例中,您尝试访问未初始化的值。

boxes = {}
counter = 1
for box in ListOfBoxes:

    boxes['boxes'][counter]['ID']= box.ID

此处boxes是一个空字典,但boxes['boxes']尚不存在,您尝试访问的其他任何级别也不存在。

第二个示例说明了在尝试使用数据结构之前如何初始化每个新图层。

# Create a new Dictionary, assign to a key in Dictionary 'boxes'
boxes['boxes'] = {}

# Create a new List, assign to a key in Dictionary we just created
boxes['boxes'][counter] = []

# Now that this List exists, we can use .append() to add to it
boxes['boxes'][counter].append({'ID': box.ID, 'name':box.name, 'state': box.state, 'directory': box.directory, 'provider': box.provider})

您收到了KeyError,因为您尝试访问尚不存在的字典密钥:boxes['boxes']从未初始化为具有值;因此,它不存在。