如何让defaultdict对意外客户端安全?
我之前好几次(甚至连续好几次)被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
中,除非这样做会严重影响性能。