On the example you give, you first try to retrieve a non-existing value on the list, as you do dl[2]['a']
, Python first retrieve the third (index 2) element on the list, then proceed to get the element named ‘a’ on that object – therefore you have to implement your automatic extending behavior to the __getitem__
method as well, like this:
class defaultlist(list):
def __init__(self, fx):
self._fx = fx
def _fill(self, index):
while len(self) <= index:
self.append(self._fx())
def __setitem__(self, index, value):
self._fill(index)
list.__setitem__(self, index, value)
def __getitem__(self, index):
self._fill(index)
return list.__getitem__(self, index)