繁体   English   中英

为什么我在没有 __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被认为是不同类型的不同 object。 但是为什么这会导致无限循环而不是抛出异常呢?

我添加了以下方法:

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

现在我收到一条适当的错误消息。

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

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

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

  • 如果__getitem__不引发异常,则尝试迭代实现__getitem__但未实现__iter__的 object 是一个无限循环。 看到这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM