在关于序列的协议中

时间:2009-12-01 03:09:23

标签: python protocols

如何在python级别实现?

我有一个假装在大多数情况下都是dict的对象(回想起来我应该只是继承dict,但我宁愿不重构代码库,我也想知道这对于将来参考),看起来有点像

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value

当我尝试将其元素作为configThingerInstance ['whatever']

进行访问时,其工作原理与其应有的完全相同

但是像

这样的电话
t = configThinger()
t.populate() # Internal method that fills it with some useful data
if 'DEBUG' in t:
    doStuff()

导致引发KeyError,因为可能是`in'协议对所讨论的密钥执行 getitem ()查找。我是否需要提出一些其他例外来告诉它不存在? 我宁愿不做这样的事情。

try:
    t['DEBUG']
except KeyError:
    pass
else:
    doStuff()

此外,文档中的位置是什么?

我环顾四周

http://docs.python.org/tutorial/datastructures.html

http://docs.python.org/library/stdtypes.html

但是悲惨地试图谷歌搜索特定于'in'这个词的东西是愚蠢的:(

编辑1:

通过一堆跟踪打印,我可以看到该程序调用configThingerInstance。 getitem (0)

然而

t = {'rawk': 1,
     'rawr': 2,
    }
t[0] # Raises KeyError
'thing' in t # returns False

2 个答案:

答案 0 :(得分:3)

听起来你想要重载in运算符?

您可以通过定义方法__contains__http://docs.python.org/reference/datamodel.html#object.contains

来实现

答案 1 :(得分:1)

为了获得in运算符的最佳支持(包含名称成员资格检查),请在__contains__类上实施configThinger特殊方法:

class configThinger(object):
    _config = {}
    def __getitem__(self, key):
        return self._config[key]
    def __setitem__(self, key, value):
        self._config[key] = value
    def __contains__(self, key):
        return key in self._config

文档为here(也解释了支持in运算符的其他较小方式)。