如何为无意识的客户端设置defaultdict安全?

use*_*193 6 python default-value

有几次(甚至连续几次)我被defaultdict错误所困扰:忘记了某些东西实际上是一个默认的,并把它当成一个普通的字典.

d = defaultdict(list)

...

try:
  v = d["key"]
except KeyError:
  print "Sorry, no dice!"
Run Code Online (Sandbox Code Playgroud)

对于那些被咬过的人来说,问题很明显:当d没有键'key'时,v = d["key"]神奇地创建一个空列表并将其分配给两者d["key"]v不是引发异常.如果d来自某些模块,其中的细节不太清楚,那么追踪可能会非常痛苦.

我正在寻找一种方法来消除这个bug.对我来说,最好的解决方案是以某种方式禁用defaultdict的魔法,然后再将其返回给客户端.

evi*_*pie 14

您仍然可以将其转换为普通字典.

d = collections.defaultdict(list)
d = dict(d)
Run Code Online (Sandbox Code Playgroud)


Sil*_*ost 7

使用不同的习语:

if 'key' not in d:
    print "Sorry, no dice!"
Run Code Online (Sandbox Code Playgroud)


rkh*_*rov 5

您可以通过分配来阻止创建默认值d.default_factory = None.但是,我不太喜欢对象突然改变行为的想法.我更喜欢将值复制到新的值,dict除非它造成严重的性能损失.