From 415c1e36a9f3cb119fad8aa5fcdcc9f31284782e Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Wed, 16 Jan 2008 19:45:51 +0000 Subject: [PATCH] Raise a TypeError instead of a ValueError when too many initializers are used in a Structure or Union constructor. --- Lib/ctypes/test/test_structures.py | 8 ++++---- Misc/NEWS | 2 ++ Modules/_ctypes/_ctypes.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 3005e829b3a..0c5a3477630 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -222,8 +222,8 @@ class StructureTestCase(unittest.TestCase): self.assertRaises(TypeError, POINT, 2, 3, x=4) self.assertRaises(TypeError, POINT, 2, 3, y=4) - # Should this raise TypeError instead? - self.assertRaises(ValueError, POINT, 2, 3, 4) + # too many initializers + self.assertRaises(TypeError, POINT, 2, 3, 4) def test_keyword_initializers(self): class POINT(Structure): @@ -320,9 +320,9 @@ class StructureTestCase(unittest.TestCase): self.failUnlessEqual(cls, RuntimeError) if issubclass(Exception, object): self.failUnlessEqual(msg, - "(Phone) : too many initializers") + "(Phone) : too many initializers") else: - self.failUnlessEqual(msg, "(Phone) exceptions.ValueError: too many initializers") + self.failUnlessEqual(msg, "(Phone) exceptions.TypeError: too many initializers") def get_except(self, func, *args): diff --git a/Misc/NEWS b/Misc/NEWS index 29bd3dd9397..497889be92c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -366,6 +366,8 @@ Library - Issue #1831: ctypes now raises a TypeError if conflicting positional and named arguments are passed to a Structure or Union initializer. + When too many positional arguments are passed, also a TypeError is + raised instead of a ValueError. - Convert the internal ctypes array type cache to a WeakValueDict so that array types do not live longer than needed. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8c6619489f7..24d3c2fd51c 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3557,7 +3557,7 @@ Struct_init(PyObject *self, PyObject *args, PyObject *kwds) if (PyTuple_GET_SIZE(args) > PySequence_Length(fields)) { Py_DECREF(fields); - PyErr_SetString(PyExc_ValueError, + PyErr_SetString(PyExc_TypeError, "too many initializers"); return -1; }