class Foo:
def __getitem__(self, item):
print('getitem', item)
if item == 6:
raise IndexError
return item**2
def __len__(self):
print('len')
return 3
class Bar:
def __iter__(self):
print('iter')
return iter([3, 5, 42, 69])
def __len__(self):
print('len')
return 3
Демо:
>>> list(Foo())
len
getitem 0
getitem 1
getitem 2
getitem 3
getitem 4
getitem 5
getitem 6
[0, 1, 4, 9, 16, 25]
>>> list(Bar())
iter
len
[3, 5, 42, 69]
Почему list
вызывает __len__
? Кажется, он не использует результат для чего-либо очевидного. A for
loop не делает этого. Это нигде не упоминается в протоколе итератора, который просто говорит о __iter__
и __next__
.
Является ли этот Python резервированием места для списка заранее или что-то умное?
(CPython 3.6.0 для Linux)