我是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寻找答案时,大多数情况下使用第二段代码。至少这是我从中理解的。
答案 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']
从未初始化为具有值;因此,它不存在。