为什么我运行没有__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。
以下代码进入死循环:
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。