在 KeyError 上打印字典

Print dict on KeyError

我正在处理几个巨大的字典列表,其中一些可能缺少项目。我遇到了很多 KeyErrors。他们告诉我坏键是什么,但他们没有告诉我有问题的命令是什么。我想要相当于

的东西
foos = [{'abc': 0, 'bcd': 1}, {'abc': 2}, {'abc': 4, 'bcd': 0}]
for foo in foos:
    try:
        print foo['bcd']
    except KeyError as err:
        print 'bcd not found in ' + str(foo)

但是我在哪里订阅 foos、bars、bazes 和 quxes。换句话说,如果我的错误打印语句可以推断 'foo' 是有问题的字典,我会喜欢它,而我不必明确说明它。在处理大量词典时,我真的不想给每个下标单独的 try/except 块。

如果您正在查找列表中字典的索引,您可以使用枚举:

foos = [{'abc': 0, 'bcd': 1}, {'abc': 2}, {'abc': 4, 'bcd': 0}]
for idx, foo in enumerate(foos):
    try:
        print foo['bcd']
    except KeyError as err:
        print 'bcd not found in dictionary #' + idx

如果您想在每次尝试访问不存在的键时打印查找到的键及其字典,在我看来您必须继承 dict.

class ErrorDict(dict):

    def __getitem__(self, key):
        try:
            val = dict.__getitem__(self, key)
        except KeyError:
            val = None
            print '{0} not found in {1}'.format(key, self)

        return val


foos = [ErrorDict(i) for i in ({'abc': 0, 'bcd': 1}, {'abc': 2}, {'abc': 4, 'bcd': 0})]
for foo in foos:
    if foo['bcd']: # If invalid, None is returned and condition will fail.
        #... all the code
        pass

# Output: bcd not found in {'abc': 2}

这似乎满足了您的要求,据我了解,这是为了避免在代码中的任何地方使用 try/except 块。我不能说我推荐这样做,因为我没有太多子类化的经验 dict,所以我不熟悉它的潜在陷阱。

无论如何,它都能满足您的要求。如有其他问题,请拍