我正在尝试做一些相对简单的事情-使用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 。有没有一种更好的错误处理方法,不会造成这个问题?
在此先感谢您的帮助。
答案 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的答案一无所获。