有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__()
干杯!