14

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

我最近用后者替换了前者,以(成功)加快了一些代码的速度。我想确保len(someObj)在与someObj.__len__().

4

5 回答 5

17

如果__len__返回长度超过sys.maxsizelen()将引发异常。这不适用于__len__直接调用。(实际上,您可以返回任何__len__不会被捕获的对象,除非它通过len().)

于 2009-01-30T20:21:55.093 回答
11

你看到了什么样的加速?我无法想象它很明显是吗?

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

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

首先,不建议自己去调用__methods__,它们是为python的其他部分使用的。

len()将适用于任何类型的序列对象(lists、、tuples和所有)。 __len__仅适用于具有__len__方法的类实例。

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

于 2009-01-30T16:07:33.687 回答
2

我认为答案是它总是有效的——根据 Python 文档:

__len__(self):

调用以实现内置函数 len()。应返回对象的长度,整数 >= 0。此外,未定义__nonzero__()方法且其__len__()方法返回零的对象在布尔上下文中被认为是假的。

于 2009-01-30T16:03:57.093 回答
0

在某些情况下,len(someObj)与validates的返回值不同。以下是 Python 3.6.9 中可能出现的错误:someObj.__len__()len()__len__()

  • 太小,即小于0

    ValueError: __len__() should return >= 0
    
  • 太大,即大于sys.maxsize(CPython-specific,per the docs

    OverflowError: cannot fit 'int' into an index-sized integer
    
  • 无效的类型,例如float

    TypeError: 'float' object cannot be interpreted as an integer
    
  • 缺失,例如len(object)

    TypeError: object of type 'type' has no len()
    

    我提到这一点是因为object.__len__()引发了一个不同的异常,AttributeError.

还值得注意的是这range(sys.maxsize+1)是有效的,但它__len__()引发了一个例外:

OverflowError: Python int too large to convert to C ssize_t
于 2020-01-05T20:59:31.000 回答
-4

根据马克朝圣者的说法,它看起来不像。 与;len(someObj)相同someObj.__len__()

干杯!

于 2009-01-30T16:01:46.413 回答