设置例外时避免递归

时间:2018-10-23 04:44:00

标签: python exception-handling

我正在尝试做一些相对简单的事情-使用OrderedDict类,并使其能够基于整数或切片查找值。所以如果我有以下内容

from collections import OrderedDict

test_dict = OrderedDict()
test_dict['a'] = 'value a'
test_dict['b'] = 'value b'
test_dict['c'] = 'value c'

test_dict[:2]

理想情况下会给出结果

['value a','value b']

为此,我尝试将OrderedDict子类化,然后重写其 getitem 方法。我有以下内容:

class indexed_dict(OrderedDict):
    def __init__(self):
        pass

    def __getitem__(self, key):
        try:
            return list(self)[key]
        except TypeError: # Because we've entered a number instead of a key
            return self[key]

这样做的麻烦在于,如果您尝试正常使用它-例如test_indexed_dict['a']-解释器将开始递归,可能是因为except子句要求它再次运行 getitem 。有没有一种更好的错误处理方法,不会造成这个问题?

在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以检查key的类型,也可以只返回字典的上的切片:

from collections import OrderedDict
class IndexedDict(OrderedDict):
    def __init__(self):
        pass

    def __getitem__(self, key):
        if type(key) is slice:
          return list(self.values())[key]
        else:
            return super().__getitem__(key)

您在这里有一个live example

答案 1 :(得分:1)

执行self[key]后,您将再次调用自己的__getitem__方法。这导致无休止的递归。您要做的就是调用您的父类的 __getitem__方法:

def __getitem__(self, key):
    try:
        return list(self)[key]
    except TypeError: # Because we've entered a number instead of a key
        return super().__getitem__(key)

答案 2 :(得分:1)

除了@Aran_Fey的答案外,您还需要检查第一个try中的值,因此功能应为:

def __getitem__(self, key):
    try:
        return list(self.values())[key]
    except TypeError:
        return super().__getitem__(key)

整个班级:

class IndexedDict(OrderedDict):
    def __init__(self):
        pass

    def __getitem__(self, key):
        try:
            return list(self.values())[key]
        except TypeError:
            return super().__getitem__(key)

@Netwave的答案一无所获。