cpython: Issue #3693: Fix array obscure error message when given a str.

http://hg.python.org/cpython/rev/2c87d3944c7a changeset: 87647:2c87d3944c7a user: Alexandre Vassalotti <alexandre@peadrop.com> date: Fri Nov 29 20:47:15 2013 -0800 summary: Issue #3693: Fix array obscure error message when given a str. files: Lib/test/test_array.py | 12 ++++++++ Misc/NEWS | 4 ++ Modules/arraymodule.c | 45 ++++++++++++++++++------------ 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1027,6 +1027,18 @@ basesize = support.calcvobjsize('Pn2Pi') support.check_sizeof(self, a, basesize) + def test_initialize_with_unicode(self): + if self.typecode != 'u': + with self.assertRaises(TypeError) as cm: + a = array.array(self.typecode, 'foo') + self.assertIn("cannot use a str", str(cm.exception)) + with self.assertRaises(TypeError) as cm: + a = array.array(self.typecode, array.array('u', 'foo')) + self.assertIn("cannot use a unicode array", str(cm.exception)) + else: + a = array.array(self.typecode, "foo") + a = array.array(self.typecode, array.array('u', 'foo')) + class StringTest(BaseTest): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,10 @@ Library ------- +- Issue #3693: Make the error message more helpful when the array.array() + constructor is given a str. Move the array module typecode documentation to + the docstring of the constructor. + - Issue #19698: Removed exec_module() methods from importlib.machinery.BuiltinImporter and ExtensionFileLoader. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2518,6 +2518,20 @@ if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial)) return NULL; + if (initial && c != 'u') { + if (PyUnicode_Check(initial)) { + PyErr_Format(PyExc_TypeError, "cannot use a str to initialize " + "an array with typecode '%c'", c); + return NULL; + } + else if (array_Check(initial) && + ((arrayobject*)initial)->ob_descr->typecode == 'u') { + PyErr_Format(PyExc_TypeError, "cannot use a unicode array to " + "initialize an array with typecode '%c'", c); + return NULL; + } + } + if (!(initial == NULL || PyList_Check(initial) || PyByteArray_Check(initial) || PyBytes_Check(initial) @@ -2644,9 +2658,19 @@ "This module defines an object type which can efficiently represent\n\ an array of basic values: characters, integers, floating point\n\ numbers. Arrays are sequence types and behave very much like lists,\n\ -except that the type of objects stored in them is constrained. The\n\ -type is specified at object creation time by using a type code, which\n\ -is a single character. The following type codes are defined:\n\ +except that the type of objects stored in them is constrained.\n"); + +PyDoc_STRVAR(arraytype_doc, +"array(typecode [, initializer]) -> array\n\ +\n\ +Return a new array whose items are restricted by typecode, and\n\ +initialized from the optional initializer value, which must be a list,\n\ +string or iterable over elements of the appropriate type.\n\ +\n\ +Arrays represent basic values and behave very much like lists, except\n\ +the type of objects stored in them is constrained. The type is specified\n\ +at object creation time by using a type code, which is a single character.\n\ +The following type codes are defined:\n\ \n\ Type code C Type Minimum size in bytes \n\ 'b' signed integer 1 \n\ @@ -2670,21 +2694,6 @@ C compiler used to build Python supports 'long long', or, on Windows, \n\ '__int64'.\n\ \n\ -The constructor is:\n\ -\n\ -array(typecode [, initializer]) -- create a new array\n\ -"); - -PyDoc_STRVAR(arraytype_doc, -"array(typecode [, initializer]) -> array\n\ -\n\ -Return a new array whose items are restricted by typecode, and\n\ -initialized from the optional initializer value, which must be a list,\n\ -string or iterable over elements of the appropriate type.\n\ -\n\ -Arrays represent basic values and behave very much like lists, except\n\ -the type of objects stored in them is constrained.\n\ -\n\ Methods:\n\ \n\ append() -- append a new item to the end of the array\n\ -- Repository URL: http://hg.python.org/cpython
participants (1)
-
alexandre.vassalotti