有没有len(someObj)不调用someObj的__len__函数的情况?

Dav*_*cke 7 python

有没有len(someObj)不调用someObj __len__函数的情况?

我最近用(成功的)努力将前者替换为后者以加速某些代码.我想确保在某些地方len(someObj)与someObj不同的边缘情况.__len__().

Ben*_*son 9

如果__len__返回一个长度sys.maxsize,len()将引发异常.__len__直接打电话不是这样.(事实上__len__,除非经过,否则你可以返回任何不会被捕获的物体len().)

  • 请注意,由于 `len` 应该返回集合中元素的数量,因此返回大于 `sys.maxsize` 的值几乎肯定是无稽之谈。 (3认同)
  • @Mike理论上你可以有一个像Python 3的“range”这样的对象,它不会将其所有元素存储在内存中,而是使用数学计算其“__len__”。在这种情况下,“range.__len__”本身会引发错误:“range(sys.maxsize+1).__len__()”给出“OverflowError: Python int太大,无法转换为C ssize_t” (2认同)
  • 请注意,以上仅适用于 2.x。例如,在 3.6 中,我得到 `len(range(1000000000000))` -> `1000000000000`,以及(令人担忧的)`range(1000000000000).__len__()` -> `-727379968`。尽管这个结果仍然说明了为什么你不应该自己调用`__len__`! (2认同)

Cre*_*esh 8

你看到了什么样的加速?我无法想象它是否引人注目?

来自http://mail.python.org/pipermail/python-list/2002-May/147079.html

在某些情况下没有区别,但出于几个原因使用len()是首选.

首先,不建议__methods__自己调用它们,它们应该被python的其他部分使用.

len()将在任何类型的序列对象的工作(lists,tuples,和所有). __len__只能使用__len__方法在类实例上工作.

len() 将在没有长度的对象上返回更合适的异常.