在 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
,所以我不熟悉它的潜在陷阱。
无论如何,它都能满足您的要求。如有其他问题,请拍
我正在处理几个巨大的字典列表,其中一些可能缺少项目。我遇到了很多 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
,所以我不熟悉它的潜在陷阱。
无论如何,它都能满足您的要求。如有其他问题,请拍