]> granicus.if.org Git - python/commitdiff
Issue #13583: sqlite3.Row now supports slice indexing.
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 31 Mar 2015 10:33:11 +0000 (13:33 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 31 Mar 2015 10:33:11 +0000 (13:33 +0300)
Tests by Jessica McKellar.

Doc/library/sqlite3.rst
Lib/sqlite3/test/factory.py
Misc/NEWS
Modules/_sqlite/row.c

index 6097e7a30d7ec5f5cae6b5db5620b458a7fd7a25..fc69a804d55d2363b40e370b7856a1d76c59512c 100644 (file)
@@ -649,6 +649,9 @@ Row Objects
       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:")
index 98dcae5d6c4a88609ae842f062f767c427421e14..3d4eb0b69782ff7ffea1fcd9df8cd01629cdf361 100644 (file)
@@ -111,6 +111,24 @@ class RowFactoryTests(unittest.TestCase):
         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
index 5fb96f714177afdc0f014aa9be04b4368bfbea7b..bb67d79622ed838f5aaf1533147fa34a7684e76a 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,8 @@ Core and Builtins
 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.
index ed8ad47ffc721e354534d9a5cac20912f9921b3e..d863643f316fb86d6cec79911611a1953a67322a 100644 (file)
@@ -142,8 +142,7 @@ PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx)
         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");