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

时间:2015-12-31 02:58:38

标签: python infinite python-datamodel

我正在编写一个python类,它充当一个不可变的无限序列。

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

我很好奇处理这种对象的__len__方法的最佳方法是什么。理想情况下,我只会通过float("inf")返回__len__。但是,在幕后调用对象的len()方法的__len__函数需要一些特定的值。

如果__len__设置为返回float(" inf")或decimal.Decimal(" Infinity"),len()会通过引发TypeError来拒绝它。它也拒绝" -1"的价值。这意味着序列是无限的。此外,当我尝试使用我之前编写的无限类时,确实实际上继承自intlen()因任何原因返回0。

虽然让价值只是" 0"真的是一个很大的不便,虽然像这样的课很不寻常,但我仍然很想知道,有没有处理无限序列的类的length属性的好方法吗?

4 个答案:

答案 0 :(得分:5)

__len__()必须返回有效的整数。既然你做不到,你应该不实施__len__(),如果你的序列总是无限的,或者如果你有时可以给出一个有意义的长度,你应该提出ValueError

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

正如文档__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()