Как избежать рекурсии при настройке исключений - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь сделать что-то относительно простое - взять класс 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'] - интерпретатор начнет повторяться, предположительно, потому что в предложении исключения его просятзапустите getitem снова.Есть ли лучший способ обработки ошибок, который не создает эту проблему?

Заранее спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Когда вы делаете 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)
0 голосов
/ 23 октября 2018

В дополнение к ответу @ 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.

0 голосов
/ 23 октября 2018

Вы можете проверить тип 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)

Здесь у вас есть живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...