Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Dictionary-Modify\uuuu getitem\uuuuuu?_Python_Dictionary - Fatal编程技术网

Python-Dictionary-Modify\uuuu getitem\uuuuuu?

Python-Dictionary-Modify\uuuu getitem\uuuuuu?,python,dictionary,Python,Dictionary,好的,我已经构建了自己的变量处理程序,它有一个\uuuu getitem\uuuu函数,用于通过data[key]访问数据时,它工作得非常好,除了尝试访问项目链接时: data["key"]["subkey"] def __getitem__(self, key, **args): print key ... return self.dict[key] 当试图访问一个不存在的子键时,Python只返回一个键错误而不打印“子键”

好的,我已经构建了自己的变量处理程序,它有一个
\uuuu getitem\uuuu
函数,用于通过data[key]访问数据时,它工作得非常好,除了尝试访问项目链接时:

data["key"]["subkey"]


def __getitem__(self, key, **args):
    print key
    ...
    return self.dict[key]
当试图访问一个不存在的子键时,Python只返回一个键错误而不打印“子键”,这是为什么?我如何让Python打印出我实际想要的内容

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

这显然是可行的(但这不是我喜欢的本机语法):

我们的目标是模仿以下内容:

作品:

data = {'key' : {'subkey' : 1}}
print data["key"]["subkey"]
将不起作用,但我希望捕获
\uuuu getitem\uuuu
中的异常,然后自动创建缺少的键,或者只记录缺少的子键:

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

解决方案: 输出:

:测试

:向下

没有


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


因此,要允许任意深度,您的
\uuuuuuuGetItem\uuuuuuuuuuuu
方法必须返回一个新对象,该对象也包含这样一个
\uuuuuuuuuGetItem\uuuuuuuuuuuuuu
方法。

事实是,当Python遇到一个表达式,如
data[“key”][“subkey”]
,内部执行的是
。也就是说,解析表达式的第一部分:从对象“data”检索项“key”。然后,Python尝试对该表达式的结果对象执行do call
\uuuu getitem\uuuu
。 如果这样的结果对象本身没有
\uuuu getitem\uuu
方法,则会出现错误

这里有两种可能的解决方法:要么使用“元组索引”,比如
data[“key”,“subkey”]
(然后在
\uuuuuuGetItem\uuuuuuuuu
方法上测试是否有一个元组实例作为键)-或者让
\uuuuuGetItem\uuuuuu
返回一个特殊的对象,该对象还具有一个
\uuuuuuuuuGetItem\uuuuuuuuuuuu
方法-即使它所做的只是记录请求的键。

我是否遗漏了什么,或者这根本不值得一票否决?投票人能解释一下吗?数据的类型是什么?
数据[“键”]
的类型是什么?您可能需要显示更多的代码——否则我们所能做的就是猜测。(不是我的反对票)不,你不能直接这么做(你可以通过返回一个包装好的对象来做同样的事情)。可以这样想:
\=data['key']
后跟
\['subkey']
。如果这是访问数据的有效方法,您也可以使用
数据['key',subkey']
(元组键)。@Torxed:您可以使用
数据['key',subkey]
,它将使用
键==('key',subkey')
调用
。这比在冒号上使用字符串和拆分更简洁。但是,如果您返回一个定义了
\uuuu getitem\uuuu
的包装对象,则可以完成此操作。我更喜欢元组键版本,如果它对您的用例(可能是也可能不是)的格式是可行的。注意:您可以通过在代码中加上反勾(首选),或者在第一个下划线前面加上反斜杠来转义,从而正确格式化神奇的方法名(前导下划线和尾随下划线)。这就是它的工作原理,我只是假设python在第一个键之后会自动通过同一个变量实例再次调用getitem,我猜我必须返回变量句柄的第二个实例,以便第二个调用中存在getitem。非常感谢。我猜我必须从“变量处理程序”中返回变量句柄的第二个实例,以便第二次调用也存在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']