如何安全地使用字典

安全地使用字典,和安全地使用套套一样重要

Python 中的字典数据类型经常被用到,但当我们期待一个不存在的 key 的 value 时,它往往会带来一个异常,将我们的程序活生生终结,如何解决?

最开始的时候

当我们最初接触 Python 的时候,教学网站上面会跟你提到字典的 get()方法。利用这个方法,可以安全地返回字典的值,如果对应的 key 不存在,那么它会返回一个默认值,这个默认值默认是 None,你也可以通过设置 default 的值改变这个默认值。

需要注意的是,除了 get()方法,setdefault()方法同样可以返回默认值,但 setdefault()会将不存在的 key 的项追加到字典中,而 get()不会。

笨拙且安全的

后来,我们学会了异常处理,于是或多或少出于炫技的目的,使用异常处理来完成这个任务。这个方法适合当出现 KeyError,你不仅需要返回默认值,而且还需要做一些处理(不然为什么不使用简单的 if-else 呢?)

可是,当你多年回来 review 你的代码,你也许会感叹它的笨拙。

是时候使用魔法的力量了

利用魔法方法(特殊方法)__missing__(),当 key 不存在时,字典会调用这个方法,而非抛出 KeyError,很酷炫。

用些现成的

鉴于 collections 中 defaultdict 的易用性,我向你强烈推荐。

简单地说,它的构造函数接受两个参数,一个是默认值的生成函数(即官方文档中的工厂函数),另一个则是一个字典。通过包装,它成为一个会返回默认值的字典。

这个工厂函数可以是

  • 构造函数
  • 返回你生日的函数
  • …………

实际上,它基本没有限制。

举个栗子:

config = defaultdict(DevelopmentConfig, {
    'development': DevelopmentConfig(),
    'production': ProductionConfig(),
    'heroku': HerokuConfig(),
    'docker': DockerConfig(),
    'unix': UnixConfig(), 
})

最近在读PyDictObject,没准哪天会写一写