В чем разница между len() и .__len__()? И могут ли они возвращать разные значения?
Ответ
__len__ это магический метод, который реализует len операцию.
Как и любой другой специальный метод, он вызывается специальным образом (должен быть определён в самом классе), то есть len(o) не всегда эквивалентно o.__len__(). Подробнее в ответе о магических методах
Дополнительно, значения len() ограничены sys.maxsize
>>> import sys
>>> class Big:
... def __len__(self):
... return sys.maxsize + 1
...
>>> len(Big())
Traceback (most recent call last)
...
OverflowError: cannot fit 'int' into an index-sized integer
>>> Big().__len__()
9223372036854775808
На практике, иногда полезно иметь последовательность с большой длиной:
Get the highest possible gmtime for any architecture
Weighted random sample in python
Комментариев нет:
Отправить комментарий