Python - 字典 - 修改 __getitem__?

7 浏览
0 Comments

Python - 字典 - 修改 __getitem__?

好的,所以我建立了自己的变量处理程序,它有一个__getitem__函数,用于通过data[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']

输出:

: test

: down

None

0
0 Comments

Python - Dictionary - Modify __getitem__?

问题的出现原因是:在Python中,使用tmp = foo['bar']['baz']的方式获取字典中的值时,实际上是先获取了foo['bar']的值,然后再获取tmp['baz']的值。因此,为了允许任意深度的获取,__getitem__方法必须返回一个也包含__getitem__方法的新对象。

解决方法是:在"变量处理程序"内部返回一个变量处理程序的第二个实例,这样第二次调用时也会存在__getitem__方法。

0
0 Comments

在Python中,当遇到类似data["key"]["subkey"]的表达式时,内部实际上执行的是(data["key"])["subkey"]。也就是说,首先解析表达式的第一部分:从对象"data"中检索"key"项。然后,Python尝试在该表达式的结果对象上调用__getitem__方法。如果该结果对象本身没有__getitem__方法,就会出现错误。

解决方法有两种:要么使用"tuple indexes",例如data["key", "subkey"](然后在__getitem__方法中检查是否得到了一个元组实例作为键),要么让__getitem__方法返回一个特殊对象,该对象也具有__getitem__方法(即使它只是记录请求的键)。

所以这就是它的工作原理,我曾经以为Python会在第一次键之后通过相同的变量实例自动再次调用getitem,我猜我必须返回一个第二个变量实例,以便第二次调用中存在getitem。谢谢!

0