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

时间:2009-01-30 15:58:59

标签: python

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

我最近用后者取代了前者(成功)加速了一些代码。我想确保len(someObj)与someObj不同的边缘情况。__len__()。

5 个答案:

答案 0 :(得分:8)

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

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

  

在某些情况下没有   差异,但使用len()是   首选有几个原因。

     

首先,不建议去   他们自己打电话给__methods__   意在被其他部分使用   蟒。

     

len()适用于任何类型的   序列对象(liststuples和   所有)。   __len__仅适用于使用__len__方法的类实例。

     

len()会返回更合适的内容   没有长度的对象的异常。

答案 1 :(得分:8)

如果__len__的长度超过sys.maxsize,则len()会引发异常。直接调用__len__不是这样。 (事实上​​你可以从__len__返回任何除非经过len()才会被捕获的对象。)

答案 2 :(得分:1)

我认为答案是它始终有效 - 根据Python文档:

__len__(self):

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

答案 3 :(得分:0)

在某些情况下,len(someObj)someObj.__len__()不同,因为len()验证__len__()的返回值。这是Python 3.6.9中可能出现的错误:

  • 太小,即小于0

    ValueError: __len__() should return >= 0
    
  • 太大,即大于sys.maxsize(特定于CPython,根据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

答案 4 :(得分:-2)

根据Mark Pilgrim的说法,它看起来没有。 len(someObj)someObj.__len__()相同;

干杯!