changeset 87647:2c87d3944c7a

Issue #3693: Fix array obscure error message when given a str.
author Alexandre Vassalotti <alexandre@peadrop.com>
date Fri, 29 Nov 2013 20:47:15 -0800
parents b0e180f8e588
children 73a84d8dc544
files Lib/test/test_array.py Misc/NEWS Modules/arraymodule.c
diffstat 3 files changed, 43 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/Lib/test/test_array.py	Fri Nov 29 21:14:22 2013 -0600
+++ b/Lib/test/test_array.py	Fri Nov 29 20:47:15 2013 -0800
@@ -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):
 
--- a/Misc/NEWS	Fri Nov 29 21:14:22 2013 -0600
+++ b/Misc/NEWS	Fri Nov 29 20:47:15 2013 -0800
@@ -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.
 
--- a/Modules/arraymodule.c	Fri Nov 29 21:14:22 2013 -0600
+++ b/Modules/arraymodule.c	Fri Nov 29 20:47:15 2013 -0800
@@ -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\