为什么我运行没有__contains__就陷入死循环?

Why do I run into an infinite loop without __contains__?

以下代码进入死循环:

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 应该是不同类型的不同对象。 但为什么这最终会陷入无限循环而不是抛出异常?

我添加了以下方法:

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

现在我收到了相应的错误消息。

还有其他类似的情况需要我小心避免无限循环吗?

在没有 __contains__ 的情况下,in 运算符将使用您定义的 __getitem__ 方法来查看它是否获得您要查找的对象。它会将每个 int 依次传递给 __getitem__,直到它找到该项目或该方法引发异常。如果这两种情况都没有发生,那么您将陷入无限循环。

是的,还有其他类似的案例。

  • 如果 __getitem__ 不引发异常,则尝试迭代实现 __getitem__ 但不实现 __iter__ 的对象是一个无限循环。参见 this question