From 42dae6a89bd24073ae1b66599180cc94f15ff232 Mon Sep 17 00:00:00 2001 From: Collin Winter Date: Wed, 28 Mar 2007 21:44:53 +0000 Subject: [PATCH] Make readonly members defined in C throw an AttributeError on modification. This brings them into sync with Python-level attributes. Fixes bug #1687163. --- Lib/test/test_csv.py | 4 ++-- Lib/test/test_descr.py | 6 +++--- Lib/test/test_generators.py | 2 +- Lib/test/test_os.py | 4 ++-- Python/structmember.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index 46361c8254b..2cdc8074449 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -53,8 +53,8 @@ class Test_Csv(unittest.TestCase): self.assertEqual(obj.dialect.skipinitialspace, False) self.assertEqual(obj.dialect.strict, False) # Try deleting or changing attributes (they are read-only) - self.assertRaises(TypeError, delattr, obj.dialect, 'delimiter') - self.assertRaises(TypeError, setattr, obj.dialect, 'delimiter', ':') + self.assertRaises(AttributeError, delattr, obj.dialect, 'delimiter') + self.assertRaises(AttributeError, setattr, obj.dialect, 'delimiter', ':') self.assertRaises(AttributeError, delattr, obj.dialect, 'quoting') self.assertRaises(AttributeError, setattr, obj.dialect, 'quoting', None) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 6cd8ccd8c32..eec4e40f5b3 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1857,13 +1857,13 @@ def properties(): for attr in "__doc__", "fget", "fset", "fdel": try: setattr(raw, attr, 42) - except TypeError as msg: + except AttributeError as msg: if str(msg).find('readonly') < 0: raise TestFailed("when setting readonly attr %r on a " - "property, got unexpected TypeError " + "property, got unexpected AttributeError " "msg %r" % (attr, str(msg))) else: - raise TestFailed("expected TypeError from trying to set " + raise TestFailed("expected AttributeError from trying to set " "readonly %r attr on a property" % attr) class D(object): diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py index 7999034fe7e..12276be0d92 100644 --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -400,7 +400,7 @@ And more, added later. >>> i.gi_running = 42 Traceback (most recent call last): ... -TypeError: readonly attribute +AttributeError: readonly attribute >>> def g(): ... yield me.gi_running >>> me = g() diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 93e530c22c9..a7fc1da7de8 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -143,7 +143,7 @@ class StatAttributeTests(unittest.TestCase): try: result.st_mode = 1 self.fail("No exception thrown") - except TypeError: + except AttributeError: pass try: @@ -201,7 +201,7 @@ class StatAttributeTests(unittest.TestCase): try: result.f_bfree = 1 self.fail("No exception thrown") - except TypeError: + except AttributeError: pass try: diff --git a/Python/structmember.c b/Python/structmember.c index 2bb6e4e85c7..87c1641317b 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -164,7 +164,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v) if ((l->flags & READONLY) || l->type == T_STRING) { - PyErr_SetString(PyExc_TypeError, "readonly attribute"); + PyErr_SetString(PyExc_AttributeError, "readonly attribute"); return -1; } if ((l->flags & WRITE_RESTRICTED) && PyEval_GetRestricted()) {