有len(someObj)
没有不调用someObj__len__
函数的情况?
我最近用后者替换了前者,以(成功)加快了一些代码的速度。我想确保len(someObj)
在与someObj.__len__()
.
有len(someObj)
没有不调用someObj__len__
函数的情况?
我最近用后者替换了前者,以(成功)加快了一些代码的速度。我想确保len(someObj)
在与someObj.__len__()
.
如果__len__
返回长度超过sys.maxsize
,len()
将引发异常。这不适用于__len__
直接调用。(实际上,您可以返回任何__len__
不会被捕获的对象,除非它通过len()
.)
你看到了什么样的加速?我无法想象它很明显是吗?
来自http://mail.python.org/pipermail/python-list/2002-May/147079.html
在某些情况下没有区别,但出于几个原因,首选使用 len()。
首先,不建议自己去调用
__methods__
,它们是为python的其他部分使用的。
len()
将适用于任何类型的序列对象(lists
、、tuples
和所有)。__len__
仅适用于具有__len__
方法的类实例。
len()
将在没有长度的对象上返回更合适的异常。
我认为答案是它总是有效的——根据 Python 文档:
__len__(self):
调用以实现内置函数 len()。应返回对象的长度,整数 >= 0。此外,未定义__nonzero__()
方法且其__len__()
方法返回零的对象在布尔上下文中被认为是假的。
在某些情况下,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
根据马克朝圣者的说法,它看起来不像。 与;len(someObj)
相同someObj.__len__()
干杯!