changeset: 92826:e7e8a218737a user: R David Murray date: Sun Oct 05 11:47:01 2014 -0400 files: Doc/whatsnew/3.5.rst Lib/test/test_socket.py Misc/NEWS Modules/_operator.c Objects/abstract.c Objects/bytearrayobject.c Objects/bytes_methods.c Objects/bytesobject.c Objects/longobject.c Objects/memoryobject.c Python/getargs.c description: #16518: Bring error messages in harmony with docs ("bytes-like object") Some time ago we changed the docs to consistently use the term 'bytes-like object' in all the contexts where bytes, bytearray, memoryview, etc are used. This patch (by Ezio Melotti) completes that work by changing the error messages that previously reported that certain types did "not support the buffer interface" to instead say that a bytes-like object is required. (The glossary entry for bytes-like object references the discussion of the buffer protocol in the docs.) diff -r 9f858477df31 -r e7e8a218737a Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst Sun Oct 05 17:38:45 2014 +0200 +++ b/Doc/whatsnew/3.5.rst Sun Oct 05 11:47:01 2014 -0400 @@ -393,6 +393,12 @@ The *convert_charrefs* argument of :class:`~html.parser.HTMLParser` is now ``True`` by default (contributed by Berker Peksag in :issue:`21047`). +* Although it is not formally part of the API, it is worth noting for porting + purposes (ie: fixing tests) that error messages that were previously of the + form "'sometype' does not support the buffer protocol" are now of the form "a + bytes-like object is required, not 'sometype'" (contributed by Ezio Melotti + in :issue:`16518`). + Changes in the C API -------------------- diff -r 9f858477df31 -r e7e8a218737a Lib/test/test_socket.py --- a/Lib/test/test_socket.py Sun Oct 05 17:38:45 2014 +0200 +++ b/Lib/test/test_socket.py Sun Oct 05 11:47:01 2014 -0400 @@ -711,11 +711,11 @@ with self.assertRaises(TypeError) as cm: s.sendto('\u2620', sockname) self.assertEqual(str(cm.exception), - "'str' does not support the buffer interface") + "a bytes-like object is required, not 'str'") with self.assertRaises(TypeError) as cm: s.sendto(5j, sockname) self.assertEqual(str(cm.exception), - "'complex' does not support the buffer interface") + "a bytes-like object is required, not 'complex'") with self.assertRaises(TypeError) as cm: s.sendto(b'foo', None) self.assertIn('not NoneType',str(cm.exception)) @@ -723,11 +723,11 @@ with self.assertRaises(TypeError) as cm: s.sendto('\u2620', 0, sockname) self.assertEqual(str(cm.exception), - "'str' does not support the buffer interface") + "a bytes-like object is required, not 'str'") with self.assertRaises(TypeError) as cm: s.sendto(5j, 0, sockname) self.assertEqual(str(cm.exception), - "'complex' does not support the buffer interface") + "a bytes-like object is required, not 'complex'") with self.assertRaises(TypeError) as cm: s.sendto(b'foo', 0, None) self.assertIn('not NoneType', str(cm.exception)) diff -r 9f858477df31 -r e7e8a218737a Misc/NEWS --- a/Misc/NEWS Sun Oct 05 17:38:45 2014 +0200 +++ b/Misc/NEWS Sun Oct 05 11:47:01 2014 -0400 @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #16518: Use 'bytes-like object required' in error messages that + previously used the far more cryptic "'x' does not support the buffer + protocol. + - Issue #22470: Fixed integer overflow issues in "backslashreplace", "xmlcharrefreplace", and "surrogatepass" error handlers. diff -r 9f858477df31 -r e7e8a218737a Modules/_operator.c --- a/Modules/_operator.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Modules/_operator.c Sun Oct 05 11:47:01 2014 -0400 @@ -241,7 +241,7 @@ "Return 'a == b'. This function uses an approach designed to prevent\n" "timing analysis, making it appropriate for cryptography.\n" "a and b must both be of the same type: either str (ASCII only),\n" -"or any type that supports the buffer protocol (e.g. bytes).\n" +"or any bytes-like object.\n" "\n" "Note: If a and b are of different lengths, or if an error occurs,\n" "a timing attack could theoretically reveal information about the\n" diff -r 9f858477df31 -r e7e8a218737a Objects/abstract.c --- a/Objects/abstract.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/abstract.c Sun Oct 05 11:47:01 2014 -0400 @@ -260,8 +260,7 @@ pb = obj->ob_type->tp_as_buffer; if (pb == NULL || pb->bf_getbuffer == NULL) { PyErr_SetString(PyExc_TypeError, - "expected bytes, bytearray " - "or buffer compatible object"); + "expected a bytes-like object"); return -1; } if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1; @@ -306,7 +305,7 @@ if (pb == NULL || pb->bf_getbuffer == NULL) { PyErr_SetString(PyExc_TypeError, - "expected an object with a buffer interface"); + "expected a bytes-like object"); return -1; } @@ -336,7 +335,7 @@ pb->bf_getbuffer == NULL || ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) { PyErr_SetString(PyExc_TypeError, - "expected an object with a writable buffer interface"); + "expected a writable bytes-like object"); return -1; } @@ -355,7 +354,7 @@ { if (!PyObject_CheckBuffer(obj)) { PyErr_Format(PyExc_TypeError, - "'%.100s' does not support the buffer interface", + "a bytes-like object is required, not '%.100s'", Py_TYPE(obj)->tp_name); return -1; } @@ -530,8 +529,8 @@ if (!PyObject_CheckBuffer(dest) || !PyObject_CheckBuffer(src)) { PyErr_SetString(PyExc_TypeError, - "both destination and source must have the "\ - "buffer interface"); + "both destination and source must be "\ + "bytes-like objects"); return -1; } diff -r 9f858477df31 -r e7e8a218737a Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/bytearrayobject.c Sun Oct 05 11:47:01 2014 -0400 @@ -87,7 +87,7 @@ if (buffer == NULL || buffer->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't support the buffer API", + "a bytes-like object is required, not '%.100s'", Py_TYPE(obj)->tp_name); return -1; } diff -r 9f858477df31 -r e7e8a218737a Objects/bytes_methods.c --- a/Objects/bytes_methods.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/bytes_methods.c Sun Oct 05 11:47:01 2014 -0400 @@ -371,7 +371,7 @@ if (buffer == NULL || buffer->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't support the buffer API", + "a bytes-like object is required, not '%.100s'", Py_TYPE(obj)->tp_name); return -1; } diff -r 9f858477df31 -r e7e8a218737a Objects/bytesobject.c --- a/Objects/bytesobject.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/bytesobject.c Sun Oct 05 11:47:01 2014 -0400 @@ -29,7 +29,7 @@ if (bufferprocs == NULL || bufferprocs->bf_getbuffer == NULL) { PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't support the buffer API", + "a bytes-like object is required, not '%.100s'", Py_TYPE(obj)->tp_name); return -1; } diff -r 9f858477df31 -r e7e8a218737a Objects/longobject.c --- a/Objects/longobject.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/longobject.c Sun Oct 05 11:47:01 2014 -0400 @@ -4873,9 +4873,7 @@ \n\ Return the integer represented by the given array of bytes.\n\ \n\ -The bytes argument must either support the buffer protocol or be an\n\ -iterable object producing bytes. Bytes and bytearray are examples of\n\ -built-in objects that support the buffer protocol.\n\ +The bytes argument must be a bytes-like object (e.g. bytes or bytearray).\n\ \n\ The byteorder argument determines the byte order used to represent the\n\ integer. If byteorder is 'big', the most significant byte is at the\n\ diff -r 9f858477df31 -r e7e8a218737a Objects/memoryobject.c --- a/Objects/memoryobject.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Objects/memoryobject.c Sun Oct 05 11:47:01 2014 -0400 @@ -792,7 +792,7 @@ } PyErr_Format(PyExc_TypeError, - "memoryview: %.200s object does not have the buffer interface", + "memoryview: a bytes-like object is required, not '%.200s'", Py_TYPE(v)->tp_name); return NULL; } diff -r 9f858477df31 -r e7e8a218737a Python/getargs.c --- a/Python/getargs.c Sun Oct 05 17:38:45 2014 +0200 +++ b/Python/getargs.c Sun Oct 05 11:47:01 2014 -0400 @@ -1244,7 +1244,8 @@ supports it directly. */ if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) { PyErr_Clear(); - return converterr("read-write buffer", arg, msgbuf, bufsize); + return converterr("read-write bytes-like object", + arg, msgbuf, bufsize); } if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) { PyBuffer_Release((Py_buffer*)p); @@ -1282,7 +1283,7 @@ *errmsg = NULL; *p = NULL; if (pb != NULL && pb->bf_releasebuffer != NULL) { - *errmsg = "read-only pinned buffer"; + *errmsg = "read-only bytes-like object"; return -1; } @@ -1298,7 +1299,7 @@ getbuffer(PyObject *arg, Py_buffer *view, char **errmsg) { if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) { - *errmsg = "bytes or buffer"; + *errmsg = "bytes-like object"; return -1; } if (!PyBuffer_IsContiguous(view, 'C')) {