Python 作为无限序列的对象的_len __的正确返回值

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

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

该类不使用生成器访问这个无限序列,而是根据
\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()