Python - 字典 - 修改 __getitem__?
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
在Python中,当遇到类似data["key"]["subkey"]
的表达式时,内部实际上执行的是(data["key"])["subkey"]
。也就是说,首先解析表达式的第一部分:从对象"data"中检索"key"项。然后,Python尝试在该表达式的结果对象上调用__getitem__
方法。如果该结果对象本身没有__getitem__
方法,就会出现错误。
解决方法有两种:要么使用"tuple indexes",例如data["key", "subkey"]
(然后在__getitem__
方法中检查是否得到了一个元组实例作为键),要么让__getitem__
方法返回一个特殊对象,该对象也具有__getitem__
方法(即使它只是记录请求的键)。
所以这就是它的工作原理,我曾经以为Python会在第一次键之后通过相同的变量实例自动再次调用getitem
,我猜我必须返回一个第二个变量实例,以便第二次调用中存在getitem
。谢谢!