Почему я сталкиваюсь с бесконечным l oop без __contains__? - PullRequest
0 голосов
/ 18 апреля 2020

Следующий код сталкивается с бесконечным l oop:

class SubCommandMap:

    def __init__(self):
        self._command = dict()

    def __getitem__(self, key):
        return self._command.get(key)

    def __setitem__(self, key, value):
        self._command[key] = value

m = SubCommandMap()
" " in m   # <- why is this an infinite loop?

Конечно, это ошибка. m предполагалось, что это другой объект другого типа. Но почему это заканчивается бесконечным l oop вместо выдачи исключения?

Я добавил следующий метод:

    def __contains__(self, other):
        raise NotImplementedError()

Теперь я получаю соответствующее сообщение об ошибке.

Есть ли другие подобные случаи, когда мне нужно быть осторожным, чтобы избежать бесконечного l oop?

1 Ответ

3 голосов
/ 18 апреля 2020

В отсутствие __contains__ оператор in будет использовать метод __getitem__, который вы определили, чтобы увидеть, получает ли он искомый объект. Он будет передавать каждое int по очереди __getitem__, пока не найдет элемент или метод не вызовет исключение. Если ничего из этого не происходит, у вас есть бесконечное число l oop.

...