Python异常KeyError问题

时间:2011-08-31 16:23:32

标签: python

这真是一个新手问题,但我无法弄清楚如何调试,所以我在这里。 Python官方文档说:“异常KeyError:在现有密钥集中找不到映射(字典)密钥时引发。”很简单。

我正在编写Python代码来生成嵌套字典,从外部字典开始并向内工作。以下是代码:

dict1 = {}

# retrieve information from the database
rs = db.execute("select id_stn, id_typ, id_dev, id from point where id='keyword1' and id_typ<>'keyword2' and id_typ<>'keyword3' and good=1")

# adding information to dictionay
for line in rs:
    arg = [x.strip() for x in line]

    if arg[0] not in stnList:
        continue

    typ = arg[1]

    if arg[0] not in dict1:
        dict1[arg[0]] = {}

    if Typ not in dict1[arg[0]]:
        dict1[arg[0]][typ] = {}

    dev = arg[2]

    if typ == 'TYPE1':
        dev = arg[2].replace('_M','').replace('_N','')
        m = pattern.search(dev)
        if m:
            dev = m.group(1)

    dict1[arg[0]][typ][dev] = []

    newTyp = 'CK' + typ

    if newTyp not in dict1[arg[0]]:
        dict1[arg[0]][newTyp] = {}

    dict1[arg[0]][newTyp][dev] = arg[:]

代码编译并执行正常。但是,当我在代码中添加以下内容时:

for line in avr:
    print (dict1[arg[0]], dict1[newTyp], dict1[dev], arg)

我得到了KeyError,其中一个“newTyp”不在列表中。我三重检查,关键是肯定在“newTyp”列表中。然后,如果我这样做:

print (dict1)

它打印出一切都很好,但不是我想要的一个很好的列出的视图。我希望输出显示如下:

Dict1 | level 1-1  | level 2-1-1 | level 3-1-1-1 | core [1]
                                                 | core [2]
                                                 | core [3]
                                 | level 3-1-1-2 | core [1]
                                                 | core [2]
                   | level 2-1-2 | level 3-1-2-1 | core [1]
                                                 | core [2]
                                 | level 3-1-2-2 | core [1]
      | level 1-2  | level 2-2-1 | level 3-2-1-1 | core [1]
                                 | level 3-2-1-2 | core [1]
                   | level 2-2-2 | level 3-2-2-1 | core [1]
                                                 | core [2]
                                 | level 3-2-2-2 | core [1]
  ..........

我错过了什么吗?如何生成一个很好的格式化输出?

提前致谢:)

1 个答案:

答案 0 :(得分:3)

尝试以下方法:

for line in avr:
    try:
        print (dict1[arg[0]], dict1[newTyp], dict1[dev], arg)
    except KeyError:
        import sys, pdb
        pdb.post_mortem(sys.exc_info()[2])

然后在进程仍处于控制台的情况下运行它,您可以在出现错误时inspect the stack查看实际情况。