对于充当无限序列的对象,__len__ 的正确 return 值

Proper return value for __len__ for an object that acts as an infinite sequence

我正在写一个 python class 作为一个不可变的无限序列。

class 不使用生成器来访问这个无限序列,而是根据 __getitem__ 方法中的算法为序列中的任意索引生成一个值。

我很好奇处理此类对象的 __len__ 方法的最佳方法是什么。理想情况下,我会 return float("inf")__len__。但是,在后台调用对象的 __len__ 方法的 len() 函数需要一个特定的值。

如果 __len__ 设置为 return float("inf") 或 decimal.Decimal("Infinity"),len() 通过提高拒绝它类型错误。它还拒绝“-1”的值,这意味着序列是无限的。此外,当我尝试使用我之前碰巧写过的无穷大 class 时,确实 实际上继承自 intlen() 无论出于何种原因returned 0.

虽然允许该值只是“0”并不是什么大的不便,虽然像这样的 class 很不寻常,但我仍然很想知道,有没有好的如何处理无限序列的 class 的长度属性?

__len__() 必须 return 一个有效的整数。既然你不能,你应该要么不实现 __len__(),如果你的序列总是无限的,或者如果你有时可以给出有意义的长度,则提出 ValueError

我认为唯一合理的解决方案是根本不实现 __len__,因为实际上您的对象没有长度。

不要为此 class 定义 __len__,因为这在语义上无法回答它。

如文档 __len__ must return an integer >= 0 中所述,因此 TypeError

以无限itertools.cycle为榜样,并提出适当的TypeError表示没有长度:

from itertools import cycle
c = cycle("a")
len(c)

TypeError: object of type 'itertools.cycle' has no len()