changeset: 95319:e47f520eb756 user: Serhiy Storchaka date: Tue Mar 31 13:33:11 2015 +0300 files: Doc/library/sqlite3.rst Lib/sqlite3/test/factory.py Misc/NEWS Modules/_sqlite/row.c description: Issue #13583: sqlite3.Row now supports slice indexing. Tests by Jessica McKellar. diff -r 475461033bb2 -r e47f520eb756 Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst Tue Mar 31 13:18:35 2015 +0300 +++ b/Doc/library/sqlite3.rst Tue Mar 31 13:33:11 2015 +0300 @@ -649,6 +649,9 @@ This method returns a list of column names. Immediately after a query, it is the first member of each tuple in :attr:`Cursor.description`. + .. versionchanged:: 3.5 + Added support of slicing. + Let's assume we initialize a table as in the example given above:: conn = sqlite3.connect(":memory:") diff -r 475461033bb2 -r e47f520eb756 Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py Tue Mar 31 13:18:35 2015 +0300 +++ b/Lib/sqlite3/test/factory.py Tue Mar 31 13:33:11 2015 +0300 @@ -111,6 +111,24 @@ with self.assertRaises(IndexError): row[2**1000] + def CheckSqliteRowSlice(self): + # A sqlite.Row can be sliced like a list. + self.con.row_factory = sqlite.Row + row = self.con.execute("select 1, 2, 3, 4").fetchone() + self.assertEqual(row[0:0], ()) + self.assertEqual(row[0:1], (1,)) + self.assertEqual(row[1:3], (2, 3)) + self.assertEqual(row[3:1], ()) + # Explicit bounds are optional. + self.assertEqual(row[1:], (2, 3, 4)) + self.assertEqual(row[:3], (1, 2, 3)) + # Slices can use negative indices. + self.assertEqual(row[-2:-1], (3,)) + self.assertEqual(row[-2:], (3, 4)) + # Slicing supports steps. + self.assertEqual(row[0:4:2], (1, 3)) + self.assertEqual(row[3:0:-2], (4, 2)) + def CheckSqliteRowIter(self): """Checks if the row object is iterable""" self.con.row_factory = sqlite.Row diff -r 475461033bb2 -r e47f520eb756 Misc/NEWS --- a/Misc/NEWS Tue Mar 31 13:18:35 2015 +0300 +++ b/Misc/NEWS Tue Mar 31 13:33:11 2015 +0300 @@ -13,6 +13,8 @@ Library ------- +- Issue #13583: sqlite3.Row now supports slice indexing. + - Issue #18473: Fixed 2to3 and 3to2 compatible pickle mappings. Fixed ambigious reverse mappings. Added many new mappings. Import mapping is no longer applied to modules already mapped with full name mapping. diff -r 475461033bb2 -r e47f520eb756 Modules/_sqlite/row.c --- a/Modules/_sqlite/row.c Tue Mar 31 13:18:35 2015 +0300 +++ b/Modules/_sqlite/row.c Tue Mar 31 13:33:11 2015 +0300 @@ -142,8 +142,7 @@ return NULL; } else if (PySlice_Check(idx)) { - PyErr_SetString(PyExc_ValueError, "slices not implemented, yet"); - return NULL; + return PyObject_GetItem(self->data, idx); } else { PyErr_SetString(PyExc_IndexError, "Index must be int or string");