FluentPython笔记0x07

Mappings with Flexible Key Lookup(p70)

  • defaultdict:类似与dict.default(),可创建一个带有默认值类型的dict,例如defaultdict(int),则遇到不存在的Key时,其取值为0。这个过程中会调用default_factory,进而会调用special method __missing__

  • __missing__:该special method没有在dict中定义,但如果在dict的子类中定义__missing__,则__getitem__在遇到缺失的key时不会抛出KeyError,而是会转而调用__missing____missing__在其他时候不会被调用,例如__contains__

  • 例3-7:


class StrKeyDict0(dict):

    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()

有两处需要注意:
1.在__missing__中,isinstance的检查不可少。__missing__被调用时,情况有三种:(1)是int型,但其str型在dict中;(2)是int型,且str型不在dict中;(3)是str型但不在dict中。如果没有isinstance的过滤,str型也不在dict中时self[str(key)]还会调用__missing__,陷入死循环。
2.在__contains__中,没有使用key in dict而是用key in dict.keys()是因为前者依然会调用__missing__,而导致int型的2也会在dictkeys中。

Author: SinLapis
Link: http://sinlapis.github.io/2017/09/15/FluentPython笔记0x07/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.