0

Python でネストされた dict から値を取得しようとしています。問題は、ネストされたdictの親が利用できない場合、NoneまたはZeroを返したいのですが、getを使用する際の問題はすでにNonetypeを返しているため、使用するとエラーが発生することです:

pl_map.get(item)["ref_rate"]

item が dict で使用可能な場合、コードは正常に動作しますが、NoneType オブジェクトは添え字を付けられないため、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
4

2 に答える 2

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})})
于 2013-07-31T11:52:37.513 に答える