Can you please send me a patch as an attachment?
On Mar 26, 3:13 pm, Kevin Ivarsen <[email protected]> wrote: > It appears that Python's __getslice__(self, a, b) overload has a surprising > behavior. > Fromhttp://docs.python.org/reference/datamodel.html#object.__getslice__: > > "If negative indexes are used in the slice, the length of the sequence is > added to that index." > > So when you evaluate rows[-20:], Python evaluates len(rows) (which is 13 in > the above example), and calls: > rows.__getslice__(-20+13, 2147483647) > > rather than: > rows.__getslice__(-20, None) > or rows.__getslice__(-20, 2147483647) > > as one might initially suspect. The Rows object just passes the received > indices on to self.records, so you're getting a new Rows back containing > records[-7:] - clearly not what you want!! > > SOLUTION: > > It turns out that __getslice__ is deprecated since Python 2.0, and that > __getitem__ should be used instead. If __getslice__ is missing and a a slice > is requested, __getitem__ receives a "slice" object. A proposed fix: > > - remove __getslice__ from Rows > - replace __getitem__ with: > > def __getitem__(self, i): > if isinstance(i, slice): > return Rows(self.db, self.records[i], self.colnames) > else: > row = self.records[i] > keys = row.keys() > if self.compact and len(keys) == 1 and keys[0] != '_extra': > return row[row.keys()[0]] > return row > > I've done a bit of testing with this. It fixes the problem noted by Gene, > and does not appear to break anything obvious. > > Cheers, > Kevin

