Python 作为无限序列的对象的_len __的正确返回值
我正在编写一个python类,它充当一个不可变的无限序列 该类不使用生成器访问这个无限序列,而是根据Python 作为无限序列的对象的_len __的正确返回值,python,infinite,python-datamodel,Python,Infinite,Python Datamodel,我正在编写一个python类,它充当一个不可变的无限序列 该类不使用生成器访问这个无限序列,而是根据\uuuu getitem\uuuu方法中的算法为序列中的任意索引生成一个值 我很好奇处理此类对象的\uu len\uu方法的最佳方式是什么。理想情况下,我只需通过\uuu len\uuu返回float(“inf”)。但是,在后台调用对象的\uuu len\uuu方法的len()函数需要一个特定的值 如果\uuuu len\uuuu设置为返回浮点(“inf”)或十进制.decimal(“Infin
\uuuu getitem\uuuu
方法中的算法为序列中的任意索引生成一个值
我很好奇处理此类对象的\uu len\uu
方法的最佳方式是什么。理想情况下,我只需通过\uuu len\uuu
返回float(“inf”)
。但是,在后台调用对象的\uuu len\uuu
方法的len()
函数需要一个特定的值
如果\uuuu len\uuuu
设置为返回浮点(“inf”)或十进制.decimal(“Infinity”),len()
通过引发类型错误来拒绝它。它还拒绝“-1”的值,这意味着序列是无限的。此外,当我尝试使用我之前编写的实际上从int
继承的infinity类时,len()
出于任何原因返回0
虽然允许值仅为“0”并不是一个很大的不便,而且像这样的类是非常不寻常的,但我仍然好奇地想知道,有没有一种好的方法来处理无限序列类的length属性?
\u len\u()
必须返回一个有效的整数。既然你不能,如果你的序列总是无限的,你就不应该实现\uuu len\uuu()
,或者如果你有时能给出一个有意义的长度,你就应该提出一个ValueError
。我认为唯一合理的解决方案是根本不实现\uulen\uu
,因为事实上你的对象没有长度。不要为这个类定义\uu len\uuu
,因为这在语义上是不可能回答的。如文档中所述,因此类型错误
按照infinite设置的示例,提出一个适当的TypeError
,表示没有长度:
from itertools import cycle
c = cycle("a")
len(c)
TypeError: object of type 'itertools.cycle' has no len()