From c70e003f75f40f0dcce1a7b7e02bebe16204c985 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Thu, 21 Sep 2006 18:12:15 +0000 Subject: [PATCH] Backport of fix to allow exception instances to be sliced once again. --- Lib/test/test_exceptions.py | 7 +++++++ Misc/NEWS | 11 +++++++++++ Objects/exceptions.c | 9 ++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 27d88a0fd5f..345569f679c 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -279,6 +279,13 @@ class ExceptionTests(unittest.TestCase): 'pickled "%r", attribute "%s' % (e, checkArgName)) + def testSlicing(self): + # Test that you can slice an exception directly instead of requiring + # going through the 'args' attribute. + args = (1, 2, 3) + exc = BaseException(*args) + self.failUnlessEqual(exc[:], args) + def testKeywordArgs(self): # test that builtin exception don't take keyword args, # but user-defined subclasses can if they want diff --git a/Misc/NEWS b/Misc/NEWS index 06bd3ac57ab..d3e9852707e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -4,6 +4,17 @@ Python News (editors: check NEWS.help for information about editing NEWS using ReST.) +What's New in Python 2.5.1c1? +============================= + +*Release date: XX-XXX-XXXX* + +Core and builtins +----------------- + +- Allow exception instances to be directly sliced again. + + What's New in Python 2.5 (final) ================================ diff --git a/Objects/exceptions.c b/Objects/exceptions.c index fda2ab1e301..bfe28a95c0a 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -190,12 +190,19 @@ BaseException_getitem(PyBaseExceptionObject *self, Py_ssize_t index) return PySequence_GetItem(self->args, index); } +static PyObject * +BaseException_getslice(PyBaseExceptionObject *self, + Py_ssize_t start, Py_ssize_t stop) +{ + return PySequence_GetSlice(self->args, start, stop); +} + static PySequenceMethods BaseException_as_sequence = { 0, /* sq_length; */ 0, /* sq_concat; */ 0, /* sq_repeat; */ (ssizeargfunc)BaseException_getitem, /* sq_item; */ - 0, /* sq_slice; */ + (ssizessizeargfunc)BaseException_getslice, /* sq_slice; */ 0, /* sq_ass_item; */ 0, /* sq_ass_slice; */ 0, /* sq_contains; */