Python - 字典 - 修改__getitem__?

时间:2012-02-21 13:23:20

标签: python dictionary

好的,所以我构建了自己的变量处理程序,它具有__getitem__函数,可以在通过数据[key]访问数据时使用,除了在尝试访问项目链接时它的效果很好:

data["key"]["subkey"]


def __getitem__(self, key, **args):
    print key
    ...
    return self.dict[key]

当试图访问一个不存在的子键时,Python只返回一个KeyError而不打印“subkey”,为什么会这样,我怎样才能让Python打印出我实际想要获得的内容?

我知道我可能误解了这些机制,但有没有办法模拟字典并遵循所请求的数据字符串? 主要是因为我可以在字典流中动态记录缺失的变量...

这显然有效(但它不是我喜欢的原生语法):

data["key:subkey"]

def __getitem__(self, key, **args):
    for slice in key.split(':'):
        print key
    ...

目标是模仿以下内容,

使用:

data = {'key' : {'subkey' : 1}}
print data["key"]["subkey"]

无效,但我希望在__getitem__内捕获异常,然后自动创建缺失的密钥或只记录丢失的子密钥:

data = {'key' : {}}
print data["key"]["subkey"]

解决方案:

class Var():
    def __init__(self):
        self.dict = {'test' : {}}
    def __getitem__(self, var, **args):
        print ':',var
        if var in self.dict:
            v = Var(self.dict[var])
            return v

print vHandle['test']['down']

输出:

  

:测试

     

:向下

     

2 个答案:

答案 0 :(得分:5)

事实是,当Python遇到诸如data["key"]["subkey"]的表达式时,内部完成的是(data["key"])["subkey"]。也就是说,表达式的第一部分被解决:从对象“data”中检索项“key”。然后,Python尝试在该表达式的结果对象上调用__getitem__。 如果此类生成的对象本身没有__getitem__方法,则会出现错误。

有两种可能的解决方法:你应该使用“元组索引” - 就像 data["key", "subkey"](然后在你的__getitem__方法上测试,你得到一个元组实例作为键) - 或者让__getitem__返回一个也具有__getitem__方法的专用对象 - 即使它只是记录所请求的密钥。

答案 1 :(得分:4)

请记住:tmp = foo['bar']['baz']tmp = foo['bar']; tmp = tmp['baz']

相同

因此,为了允许任意深度,您的__getitem__方法必须返回一个也包含此类__getitem__方法的新对象。