summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Doc/whatsnew/3.5.rst6
-rw-r--r--Lib/test/test_socket.py8
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_operator.c2
-rw-r--r--Objects/abstract.c13
-rw-r--r--Objects/bytearrayobject.c2
-rw-r--r--Objects/bytes_methods.c2
-rw-r--r--Objects/bytesobject.c2
-rw-r--r--Objects/longobject.c4
-rw-r--r--Objects/memoryobject.c2
-rw-r--r--Python/getargs.c7
11 files changed, 30 insertions, 22 deletions
diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst
index 3e44aa242d..4530a13d76 100644
--- a/Doc/whatsnew/3.5.rst
+++ b/Doc/whatsnew/3.5.rst
@@ -393,6 +393,12 @@ Changes in the Python API
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 --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 98ee615065..3f2057bc9e 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -711,11 +711,11 @@ class GeneralModuleTests(unittest.TestCase):
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 @@ class GeneralModuleTests(unittest.TestCase):
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 --git a/Misc/NEWS b/Misc/NEWS
index c23186df96..3aa92e89a4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,10 @@ Release date: TBA
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 --git a/Modules/_operator.c b/Modules/_operator.c
index 9c5c0d206a..8f524a6449 100644
--- a/Modules/_operator.c
+++ b/Modules/_operator.c
@@ -241,7 +241,7 @@ PyDoc_STRVAR(compare_digest__doc__,
"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 --git a/Objects/abstract.c b/Objects/abstract.c
index 177c34a4a4..323c985b3e 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -260,8 +260,7 @@ PyObject_AsCharBuffer(PyObject *obj,
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 @@ int PyObject_AsReadBuffer(PyObject *obj,
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 @@ int PyObject_AsWriteBuffer(PyObject *obj,
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 @@ PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
{
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 @@ int PyObject_CopyData(PyObject *dest, PyObject *src)
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 --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index f6f370d42c..84447bc7ee 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -87,7 +87,7 @@ _getbuffer(PyObject *obj, Py_buffer *view)
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 --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c
index 5314ab4c18..1cf20c97d3 100644
--- a/Objects/bytes_methods.c
+++ b/Objects/bytes_methods.c
@@ -371,7 +371,7 @@ _getbuffer(PyObject *obj, Py_buffer *view)
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 --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 87c0a25608..ff99f936aa 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -29,7 +29,7 @@ _getbuffer(PyObject *obj, Py_buffer *view)
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 --git a/Objects/longobject.c b/Objects/longobject.c
index bb2eb17a09..27bee50b8c 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -4873,9 +4873,7 @@ PyDoc_STRVAR(long_from_bytes_doc,
\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 --git a/Objects/memoryobject.c b/Objects/memoryobject.c
index 5148ce6bef..935da04cd7 100644
--- a/Objects/memoryobject.c
+++ b/Objects/memoryobject.c
@@ -792,7 +792,7 @@ PyMemoryView_FromObject(PyObject *v)
}
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 --git a/Python/getargs.c b/Python/getargs.c
index c749bb643c..f7297da5db 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -1244,7 +1244,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
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 @@ convertbuffer(PyObject *arg, void **p, char **errmsg)
*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 @@ static int
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')) {