Python映射类型对象的特殊方法__missing__

 

所有的映射类型在找不到键的时候,就会调用__missing__方法。

如果一个类继承了dict,那么继承类也会提供__missing__方法,在__getitem__时(也就是使用dict[key]取值)找不到键的情况,Python就会自动调用__missing__,而不是抛出KeyError异常。

所以,__missing__方法对get和__contains__(in运算符会用到这个方法)这些方法的使用无影响!

 

示例,自定义个映射类型:在查询的时候把非字符串的键,转换为字符串。

class StringDict(dict):
    """查询的时候把非字符串转成字符串的字典"""
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError   # 如果没有这块的判断,会递归调用,无限循环。
        else:
            return self[str(key)]

    def get(self, key, default=None):
        """
        把get查找委托给__getitem__也就是dict[key]形式,如果找不到会转到__missing__
        """
        try:
            return self[key]
        except:
            return default

    def __contains__(self, item):
        """实现in运算符的判断"""
        return item in self.keys() or str(item) in self.keys()  # 这里不能用key in dict判断,会产生递归调用

 

你可能感兴趣的:(流畅的Python读书笔记,python)