对于充当无限序列的对象,__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 时,确实 实际上继承自 int
,len()
无论出于何种原因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()
我正在写一个 python class 作为一个不可变的无限序列。
class 不使用生成器来访问这个无限序列,而是根据 __getitem__
方法中的算法为序列中的任意索引生成一个值。
我很好奇处理此类对象的 __len__
方法的最佳方法是什么。理想情况下,我会 return float("inf")
到 __len__
。但是,在后台调用对象的 __len__
方法的 len()
函数需要一个特定的值。
如果 __len__
设置为 return float("inf") 或 decimal.Decimal("Infinity"),len()
通过提高拒绝它类型错误。它还拒绝“-1”的值,这意味着序列是无限的。此外,当我尝试使用我之前碰巧写过的无穷大 class 时,确实 实际上继承自 int
,len()
无论出于何种原因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()