有没有len(someObj)没有调用someObj的__len__
函数的情况?
我最近用后者取代了前者(成功)加速了一些代码。我想确保len(someObj)与someObj不同的边缘情况。__len__
()。
答案 0 :(得分:8)
你看到了什么样的加速?我无法想象它是否引人注目?
来自http://mail.python.org/pipermail/python-list/2002-May/147079.html
在某些情况下没有 差异,但使用len()是 首选有几个原因。
首先,不建议去 他们自己打电话给
__methods__
意在被其他部分使用 蟒。
len()
适用于任何类型的 序列对象(lists
,tuples
和 所有)。__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__()
相同;
干杯!