【问题标题】:Python dict.get() raises KeyErrorPython dict.get() 引发 KeyError
【发布时间】:2017-05-23 13:16:30
【问题描述】:

我在这里迷路了,Python 2.7,我有一个字典 mt,我使用 get() 方法,文档中说:

get(key[, default]) 如果 key 在 字典,否则默认。如果没有给出默认值,则默认为 无,因此此方法永远不会引发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,有时没有密钥。

【问题讨论】:

  • 你能告诉我们山的样子吗
  • 该语法没有错误,您应该像@TimCastelijns 所说的那样显示您的mt dict,但您的dict 中似乎没有一个名为“is_rebill”的键
  • 没关系,使用get()时不应该引发KeyError
  • 它在 python2.7 中为我工作并且没有提高任何KeyError
  • mt 不是dict。使用print type(mt)) 并检查输出。

标签: python python-2.7 dictionary


【解决方案1】:

所以我解决了这个问题。在此代码实施之前,有此代码

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 {} \;

并重新加载应用程序一切都很好,没有问题。

【讨论】:

  • 使用-rf是自找麻烦。 -r 用于递归删除,如果只是要求删除文件(而不是目录),则不需要它,-f 可以掩盖应该删除但不能因为权限而删除的文件。正如有人指出的那样,find . -name "*.pyc" -delete 也有效。
【解决方案2】:
>>> mt = {'key1' : 1}
>>> mt.get('is_rebill', 0)
0

如果 key 不存在它不会产生 key 错误它返回 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

【讨论】:

  • @Down voter 请评论您投反对票的原因。
  • 这如何回答这个问题?充其量只是评论
  • OP 已经添加了文档的一部分,指出使用 .get 应该没有关键错误,因此您的答案不会对问题添加任何内容,而没有看到问题是什么 mt 是无法回答的并且应该关闭。
  • 这个问题无法回答,因为OP没有提供可重现的代码,你的答案不是答案,因为它没有解决问题,没有看到mt是什么以及代码和上下文,问题是无法解决的它用于。
  • 人们发表了评论并要求提供更多信息,但实际上,当您提出有关 SO 的问题时,应包含此信息,如果提供了必要的信息,则可以重新提出问题。我认为结束问题实际上是鼓励人们写出包含所有相关信息的好问题的一种方式
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2013-06-25
  • 2011-02-14
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多