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

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,没准哪天会写一写