Python 3.x 重写Dictionary\uuu getitem\uuuu魔术方法时出现递归错误?

Python 3.x 重写Dictionary\uuu getitem\uuuu魔术方法时出现递归错误?,python-3.x,dictionary,inheritance,magic-methods,Python 3.x,Dictionary,Inheritance,Magic Methods,如果某个键不可用,我希望我的getitem方法返回None,并将该键与值一起添加 没有一个如果该键可用,则返回该值 >>> class VariableDict(dict): def __getitem__(self, key): try: return self[key] except KeyError: self['key'] = None return Non

如果某个键不可用,我希望我的getitem方法返回None,并将该键与值一起添加 没有一个如果该键可用,则返回该值

>>> class VariableDict(dict):

    def __getitem__(self, key):
        try:
            return self[key]
        except KeyError:
            self['key'] = None
            return None


>>> d = {'a': 1, 'b': 2}
>>> d = VariableDict(d)
>>> d
{'a': 1, 'b': 2}
>>> d['k']
Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    d['k']
  File "<pyshell#60>", line 5, in __getitem__
    return self['key']
  File "<pyshell#60>", line 5, in __getitem__
    return self['key']
  File "<pyshell#60>", line 5, in __getitem__
    return self['key']
  [Previous line repeated 327 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

我在这里遇到了什么问题,有没有其他方法可以解决我的问题。还请解释一下,我的代码中出现了什么错误,以及为什么会出现这种递归错误。

基本上是因为这一行:

    return self['key']
将再次调用VariableDict的_getitem _)方法,因此您的方法将不带停止条件地继续调用自身。您需要的是使用超类getitem方法:


注意:您正在使用“key”访问给定的项目,我想您不是这个意思,因为self['key']将返回相同的值,而不管key的值是多少。

基本上是因为此行:

    return self['key']
将再次调用VariableDict的_getitem _)方法,因此您的方法将不带停止条件地继续调用自身。您需要的是使用超类getitem方法:

注意:您正在使用“key”来访问给定的项,我想您不是这个意思,因为self['key']将返回相同的值,而不管key的值是什么。

getitem方法是实现字典中键查找的方法,因此如果self['key']没有递归,您就无法执行self['key']。相反,您可能希望调用在类中重写的_getitem_uu的原始实现。通常的方法是使用super:

不过,您的代码可能还有其他问题。您接受一个名为key的参数,但实际上并没有在代码中使用它。相反,您使用字符串“key”作为在字典中查找和设置的键。可能您希望使用key而不是带引号的“key”

如果在字典中找不到值,还有一种更好的方法可以给出默认值。它没有很好的文档记录,但是Python字典可以定义一个_missing _)方法,如果它存在,将在任何键查找失败时调用它。方法返回的值将是查找的结果,如果需要,还可以修改字典。因此,实现类的更好方法可能是:

class VariableDict(dict):
    def __missing__(self, key):
        self[key] = None            # note, I'm using key instead of 'key' here!
        return None
_uuugetItem_uuuu方法是在字典中实现键查找的方法,因此如果不递归,就无法执行self['key']。相反,您可能希望调用在类中重写的_getitem_uu的原始实现。通常的方法是使用super:

不过,您的代码可能还有其他问题。您接受一个名为key的参数,但实际上并没有在代码中使用它。相反,您使用字符串“key”作为在字典中查找和设置的键。可能您希望使用key而不是带引号的“key”

如果在字典中找不到值,还有一种更好的方法可以给出默认值。它没有很好的文档记录,但是Python字典可以定义一个_missing _)方法,如果它存在,将在任何键查找失败时调用它。方法返回的值将是查找的结果,如果需要,还可以修改字典。因此,实现类的更好方法可能是:

class VariableDict(dict):
    def __missing__(self, key):
        self[key] = None            # note, I'm using key instead of 'key' here!
        return None

谢谢兄弟,现在我能够理解代码流,以及为什么会发生这个递归错误。谢谢兄弟,现在我能够理解代码流,以及为什么会发生这个递归错误。对不起,我的错。我会立即用钥匙替换“钥匙”。是的,实现丢失是更好的方法。非常感谢兄弟,对不起,我的错。我会立即用钥匙替换“钥匙”。是的,实现丢失是更好的方法。非常感谢,兄弟。