From 5d8c22cf9df68571c3319fe48e42811055e66b20 Mon Sep 17 00:00:00 2001 From: Jon Dufresne Date: Tue, 24 Jul 2018 17:20:59 -0700 Subject: [PATCH] Allow unpacking a Range object like a tuple Define the __getitem__ method on Range. Allows: - Unpacking ranges as a tuple - Indexing the Range with 0 & 1 like a tuple - Coercing to a tuple - Iterating like a tuple --- lib/_range.py | 4 ++++ tests/test_types_extras.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/_range.py b/lib/_range.py index fd15a76b..ef40ce7c 100644 --- a/lib/_range.py +++ b/lib/_range.py @@ -105,6 +105,10 @@ class Range(object): return False return self._bounds[1] == ']' + def __getitem__(self, key): + t = self._lower, self._upper + return t[key] + def __contains__(self, x): if self._bounds is None: return False diff --git a/tests/test_types_extras.py b/tests/test_types_extras.py index cda163b6..ff88bc84 100755 --- a/tests/test_types_extras.py +++ b/tests/test_types_extras.py @@ -1386,6 +1386,20 @@ class RangeTestCase(unittest.TestCase): r = Range(0, 4) self.assertEqual(loads(dumps(r)), r) + def test_getitem(self): + from psycopg2.extras import Range + r = Range(0, 4) + self.assertEqual(tuple(r), (0, 4)) + self.assertEqual(list(r), [0, 4]) + lower, upper = r + self.assertEqual(lower, 0) + self.assertEqual(upper, 4) + self.assertEqual(r[0], 0) + self.assertEqual(r[1], 4) + # String indexes are not allowed. + with self.assertRaises(TypeError): + r['abc'] + def skip_if_no_range(f): @wraps(f)