如何在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
答案 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
运算符的其他较小方式)。