Python中的dict.get()会引发KeyError异常

7
我在这里有些迷惑,使用的是 Python 2.7 版本。我有一个名为 mt 的字典,并使用 get() 方法。根据文档,该方法的定义如下:

get(key[, default]) 如果字典中存在键 key,则返回其对应的值;否则返回 default。如果没有提供 default 参数,则默认值为 None,因此该方法永远不会引发 KeyError 异常。

但我仍然无法获得想要的结果。
 File "/home/ubuntu/subscription-workers/commands/dr/rebilling.py", line 48, in rebill
    if mt.get('is_rebill', 0) == 1:
 KeyError: 'is_rebill'

有什么想法吗?

mt 是一个普通的 dict,有时没有这个键。


你能展示一下 mt 的样子吗? - Tim
那个语法没有错误,你应该像@TimCastelijns说的那样展示你的mt字典,但是看起来你的字典中没有一个叫做'is_rebill'的键。 - AlvaroAV
1
使用get()时不应该引发 KeyError。 - Tim
在Python 2.7中,这段代码对我来说是有效的,并且没有引发任何KeyError错误。 - Vishnu Upadhyay
1
"mt" 不是一个 "dict"。使用 print type(mt) 命令并检查输出。 - Matthias
2个回答

10

所以我找到了问题所在。 在此代码放置之前,有一个代码段。

File "/home/ubuntu/subscription-workers/commands/dr/rebilling.py", line 48, in rebill
    if mt['is_rebill'] == 1:
KeyError: 'is_rebill'

问题在于旧版本中有.pyc文件,但堆栈跟踪正在加载实际代码。 运行后

find . -name "*.pyc" -exec rm -rf {} \;

重新加载应用后一切正常,没有任何问题。


1
使用-rf会引来麻烦。 -r是递归删除,如果只需删除文件(非目录),则不应该需要此选项,并且-f可能会掩盖应删除但由于权限问题无法删除的文件。正如某人指出的那样,find . -name "*.pyc" -delete也可以工作。 - Mark Lakata

1
>>> mt = {'key1' : 1}
>>> mt.get('is_rebill', 0)
0

如果键不存在,它不会生成键错误,而是返回0。
>>> mt.update({'is_rebill':1})
>>> mt.get('is_rebill', 0)
1

>>> if mt.get('is_rebill', 0) == 1:
...     print True
... else:
...     print False
... 
False

1
@给点踩的人,请评论一下你的踩的原因。 - Tanveer Alam
1
这个回答如何解决问题?最多只能算是一条评论。 - Padraic Cunningham
2
OP已经添加了文档的部分内容,说明使用.get不应该出现键错误,因此您的回答对问题没有任何帮助。如果不知道MT是什么,那么这个问题是无法回答的,应该关闭。 - Padraic Cunningham
2
这个问题无法得到解答,因为提问者没有提供可重现的代码。你的回答并不是一个真正的答案,因为它并没有解决这个问题。而要想解决这个无法解决的问题,必须看到 mt 是什么以及它在代码和上下文中的使用情况。 - Padraic Cunningham
1
人们已经评论并要求提供更多信息,但实际上当您在SO上提出问题时,这些信息应该被包含在内,如果提供了必要的信息,问题可以重新打开。我认为关闭问题是一种鼓励人们撰写包含所有相关信息的好问题的方法。 - Padraic Cunningham
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接