len(someObj)
在任何情况下都会调用someObj
的__len__
函数吗?
最近我将前者替换为后者,以(成功地)加速某些代码。我想确保没有某个边缘情况,在这种情况下len(someObj)
不等同于someObj.__len__()
。
len(someObj)
在任何情况下都会调用someObj
的__len__
函数吗?
最近我将前者替换为后者,以(成功地)加速某些代码。我想确保没有某个边缘情况,在这种情况下len(someObj)
不等同于someObj.__len__()
。
__len__
返回的长度超过sys.maxsize
,len()
会引发异常。但如果直接调用__len__
,并非如此。(事实上,您可以从__len__
返回任何对象,除非它经过len()
,否则不会被捕获。)__len__(self):
该内置函数用于实现len()。应返回对象的长度,一个整数>=0。同时,在布尔上下文中,如果一个对象没有定义__nonzero__()方法并且其__len__()方法返回零,则被视为false。
有些情况下,len(someObj)
与 someObj.__len__()
不同,因为 len()
验证了 __len__()
的返回值。以下是 Python 3.6.9 中可能出现的错误:
太低了,即小于0
ValueError: __len__() 应该返回 >= 0
太高了,即大于 sys.maxsize
(仅适用于CPython,参见docs)
OverflowError: 无法将 'int' 转换为索引大小的整数
无效的类型,例如float
TypeError: 'float' 对象无法被解释为整数
缺失,例如len(object)
TypeError: 类型为 'type' 的对象没有 len()
我提到这个是因为object.__len__()
会引发不同的异常,即AttributeError
。
range(sys.maxsize+1)
是有效的,但它的 __len__()
会引发异常:OverflowError: Python int too large to convert to C ssize_t
len(someObj)
与someObj.__len__()
相同;
len
еә”иҜҘиҝ”еӣһйӣҶеҗҲдёӯе…ғзҙ зҡ„ж•°йҮҸпјҢеӣ жӯӨиҝ”еӣһжҜ”sys.maxsize
жӣҙеӨ§зҡ„еҖјеҮ д№ҺиӮҜе®ҡжҳҜж— ж„Ҹд№үзҡ„гҖӮ - Mike Grahamrange
一样的对象,它不会将所有元素存储在内存中,并使用数学计算其__len__
。 在这种情况下,range.__len__
本身会引发错误:range(sys.maxsize+1).__len__()
会产生OverflowError: Python int too large to convert to C ssize_t
。 - wjandrealen(range(1000000000000))
->1000000000000
,而且(令人担忧的是)range(1000000000000).__len__()
->-727379968
。尽管此结果仍然说明了为什么不应该自己调用__len__
! - Karl Knechtel__len__
返回的值为负数或不是整数,len
也会引发异常。 - kaya3