"Raymond Hettinger" <python@rcn.com> writes: > In Py2.3, __getitem__ conveniently supports slices for > builtin sequences: 'abcde'.__getitem__(slice(2,4)) > > For user defined classes to emulate this behavior, they need > to test the index argument to see whether it is a slice and then > loop over the slice indices like this: > > class SquaresToTen: > """Acts like a list of squares but > computes only when needed""" > > def __len__(self): > return 11 > > def __getitem__(self, index): > if isinstance(index, slice): > return [x**2 for x in range(index.start, index.stop, index.step)] You can spell that if isinstance(index, slice): return [x**2 for x in range(*index.indices(11))] and, as a bonus, it'll work more often <wink> (consider "SquaresToTen()[7::-2]", for example). > This could be simplified somewhat by making slices iterable so that > the __getitem__ definition looks more like this: > > def __getitem__(self, index): > if isinstance(index, slice): > return [x**2 for x in index] > else: > return index**2 However to make omitted slice places work, you need to pass in the length of the sequence, so I don't think this can fly. Cheers, M. -- We've had a lot of problems going from glibc 2.0 to glibc 2.1. People claim binary compatibility. Except for functions they don't like. -- Peter Van Eynde, comp.lang.lisp
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4