我试图从python中的嵌套字典中获取值。问题是,当嵌套dict的父级不可用时,我希望它返回None或Zero,但我想我使用get的问题是已经返回Nonetype,因此我在使用时遇到错误:
pl_map.get(item)["ref_rate"]
现在,当dict中的项目可用时代码工作正常,但是由于NoneType对象是unsubscriptable,它会引发TypeError。
任何人都可以告诉我如何解决这个问题,我已经粘贴了以下代码的某些部分。
基本上pl_map是一个嵌套的dict,如下面的函数所示。对于我可能做出的任何遗漏,我道歉。
for item in sorted(iwb_map):
for wh in sorted(iwb_map[item]):
#webnotes.msgprint(pl_map.get(item,0))
qty_dict = iwb_map[item][wh]
data.append([item,item_map[item]["description"], wh,
qty_dict.bal_qty,pl_map.get(item)["ref_rate"],0,0,item_map[item]["base_material"],
item_map[item]["quality"], item_map[item]["tool_type"],
item_map[item]["height_dia"], item_map[item]["width"],
item_map[item]["length"], item_map[item]["d1"],
item_map[item]["l1"], item_map[item]["is_rm"],
item_map[item]["brand"]
])
def get_pl_map(filters):
if filters.get("pl"):
conditions = " and price_list_name = '%s'" % filters["pl"]
else:
webnotes.msgprint("Please select a Price List for Valuation Purposes", raise_exception=1)
pl_map_int = webnotes.conn.sql ("""SELECT it.name, p.price_list_name, p.ref_rate
FROM `tabItem` it, `tabItem Price` p
WHERE p.parent = it.name %s
ORDER BY it.name""" % conditions, as_dict=1)
pl_map={}
for d in pl_map_int:
pl_map.setdefault(d.name,d)
#webnotes.msgprint(pl_map)
return pl_map
答案 0 :(得分:6)
让第一个.get()
返回一个空字典作为默认字典,然后使用.get()
:
pl_map.get(item, {}).get("ref_rate")
现在,您将获得pl_map[item]['ref_rate']
或None
的价值。
另一种方法是明确地测试item
:
pl_map[item]['ref_rate'] if item in pl_map else None
答案 1 :(得分:0)
可能会使用defaultdict
,因此每次不存在的密钥会在首次访问时自动初始化:
>>> from collections import defaultdict
>>> pl_map = defaultdict(lambda: defaultdict(lambda: None))
>>> pl_map["item"]["ref_rate"] # returns None
之后,所有访问的密钥都将存在:
>>> pl_map
defaultdict(<function <lambda> at 0x40350af0>, {'item': defaultdict(<function <lambda> at 0x40350a30>, {'ref_rate': None})})