我正在编写一个python类,它充当一个不可变的无限序列。
该类不使用生成器来访问此无限序列,而是根据__getitem__
方法中的算法为序列中的任意索引生成值。
我很好奇处理这种对象的__len__
方法的最佳方法是什么。理想情况下,我只会通过float("inf")
返回__len__
。但是,在幕后调用对象的len()
方法的__len__
函数需要一些特定的值。
如果__len__
设置为返回float(" inf")或decimal.Decimal(" Infinity"),len()
会通过引发TypeError来拒绝它。它也拒绝" -1"的价值。这意味着序列是无限的。此外,当我尝试使用我之前编写的无限类时,确实实际上继承自int
,len()
因任何原因返回0。
虽然让价值只是" 0"真的是一个很大的不便,虽然像这样的课很不寻常,但我仍然很想知道,有没有处理无限序列的类的length属性的好方法吗?
答案 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()