summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandre Vassalotti <alexandre@peadrop.com>2013-11-30 04:47:15 (GMT)
committerAlexandre Vassalotti <alexandre@peadrop.com>2013-11-30 04:47:15 (GMT)
commit9730e335353b9cdb6f8016e27566ca7b43e42d09 (patch)
tree8e62d2e7c4ae35e5ad76c1adc9f7dd7e283b9c00
parented7dc14d6a9598532ea535c340fce47404314c4e (diff)
downloadcpython-9730e335353b9cdb6f8016e27566ca7b43e42d09.zip
cpython-9730e335353b9cdb6f8016e27566ca7b43e42d09.tar.gz
cpython-9730e335353b9cdb6f8016e27566ca7b43e42d09.tar.bz2
Issue #3693: Fix array obscure error message when given a str.
-rwxr-xr-xLib/test/test_array.py12
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/arraymodule.c45
3 files changed, 43 insertions, 18 deletions
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index 4978c44..409d586 100755
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -1027,6 +1027,18 @@ class BaseTest:
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
index c9b1f04..3092821 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,10 @@ Core and Builtins
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
index 3466064..3b013ac 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -2518,6 +2518,20 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
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 @@ PyDoc_STRVAR(module_doc,
"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 @@ NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
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\