mirror of
https://github.com/python/cpython.git
synced 2025-09-10 02:36:56 +00:00
Issue #13583: sqlite3.Row now supports slice indexing.
Tests by Jessica McKellar.
This commit is contained in:
parent
80d84c89ee
commit
72e731cc03
4 changed files with 24 additions and 2 deletions
|
@ -649,6 +649,9 @@ Row Objects
|
||||||
This method returns a list of column names. Immediately after a query,
|
This method returns a list of column names. Immediately after a query,
|
||||||
it is the first member of each tuple in :attr:`Cursor.description`.
|
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::
|
Let's assume we initialize a table as in the example given above::
|
||||||
|
|
||||||
conn = sqlite3.connect(":memory:")
|
conn = sqlite3.connect(":memory:")
|
||||||
|
|
|
@ -111,6 +111,24 @@ class RowFactoryTests(unittest.TestCase):
|
||||||
with self.assertRaises(IndexError):
|
with self.assertRaises(IndexError):
|
||||||
row[2**1000]
|
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):
|
def CheckSqliteRowIter(self):
|
||||||
"""Checks if the row object is iterable"""
|
"""Checks if the row object is iterable"""
|
||||||
self.con.row_factory = sqlite.Row
|
self.con.row_factory = sqlite.Row
|
||||||
|
|
|
@ -13,6 +13,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #13583: sqlite3.Row now supports slice indexing.
|
||||||
|
|
||||||
- Issue #18473: Fixed 2to3 and 3to2 compatible pickle mappings. Fixed
|
- Issue #18473: Fixed 2to3 and 3to2 compatible pickle mappings. Fixed
|
||||||
ambigious reverse mappings. Added many new mappings. Import mapping is no
|
ambigious reverse mappings. Added many new mappings. Import mapping is no
|
||||||
longer applied to modules already mapped with full name mapping.
|
longer applied to modules already mapped with full name mapping.
|
||||||
|
|
|
@ -142,8 +142,7 @@ PyObject* pysqlite_row_subscript(pysqlite_Row* self, PyObject* idx)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
else if (PySlice_Check(idx)) {
|
else if (PySlice_Check(idx)) {
|
||||||
PyErr_SetString(PyExc_ValueError, "slices not implemented, yet");
|
return PyObject_GetItem(self->data, idx);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PyErr_SetString(PyExc_IndexError, "Index must be int or string");
|
PyErr_SetString(PyExc_IndexError, "Index must be int or string");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue