5

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

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

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

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

虽然允许值只是“0”并不是一个主要的不便,虽然这样的类非常不寻常,但我仍然很想知道,有没有一种处理类的长度属性的好方法那是一个无限序列?

4

4 回答 4

5

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

于 2015-12-31T03:00:46.633 回答
3

如前所述,并且在文档中__len__必须返回一个整数 >= 0,因此TypeError.

按照无限设置的示例itertools.cycle并提出适当TypeError的表示无长度:

from itertools import cycle
c = cycle("a")
len(c)

TypeError: object of type 'itertools.cycle' has no len()
于 2015-12-31T03:26:43.667 回答
3

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

于 2015-12-31T03:00:50.833 回答
3

不要__len__为这个类定义,因为这在语义上是不可能回答的。

于 2015-12-31T03:01:14.933 回答