如何让defaultdict对意外客户端安全?

8 投票
5 回答
1998 浏览
提问于 2025-04-15 23:54

我之前好几次(甚至连续好几次)被defaultdict这个问题困扰过:我忘了某个东西其实是defaultdict,结果把它当成了普通字典来用。

d = defaultdict(list)

...

try:
  v = d["key"]
except KeyError:
  print "Sorry, no dice!"

对于那些也遇到过这个问题的人来说,问题很明显:当字典d没有'key'这个键时,v = d["key"]会神奇地创建一个空列表,并把它同时赋值给d["key"]v,而不是抛出一个错误。如果d来自某个你不太记得细节的模块,这个问题就会很难追踪。

我在寻找一种方法来减少这个问题带来的困扰。对我来说,最好的解决办法是以某种方式在返回defaultdict给客户端之前,禁用它的这种“魔法”。

5 个回答

7

使用不同的习惯用语:

if 'key' not in d:
    print "Sorry, no dice!"
15

你仍然可以把它转换成一个普通的字典。

d = collections.defaultdict(list)
d = dict(d)
6

你可以通过把 d.default_factory = None 来阻止默认值的创建。不过,我不太喜欢对象突然改变行为的想法。我更倾向于把值复制到新的 dict 中,除非这样做会严重影响性能。

撰写回答