bpo-34984: Improve error messages for bytes and bytearray constructors. (GH-9874)

This commit is contained in:
Serhiy Storchaka 2018-10-21 15:29:12 +03:00 committed by GitHub
parent 914f9a078f
commit 2c2044e789
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 6 deletions

View File

@ -169,6 +169,8 @@ class BaseBytesTest:
self.assertRaises(TypeError, self.type2test, [0.0]) self.assertRaises(TypeError, self.type2test, [0.0])
self.assertRaises(TypeError, self.type2test, [None]) self.assertRaises(TypeError, self.type2test, [None])
self.assertRaises(TypeError, self.type2test, [C()]) self.assertRaises(TypeError, self.type2test, [C()])
self.assertRaises(TypeError, self.type2test, encoding='ascii')
self.assertRaises(TypeError, self.type2test, errors='ignore')
self.assertRaises(TypeError, self.type2test, 0, 'ascii') self.assertRaises(TypeError, self.type2test, 0, 'ascii')
self.assertRaises(TypeError, self.type2test, b'', 'ascii') self.assertRaises(TypeError, self.type2test, b'', 'ascii')
self.assertRaises(TypeError, self.type2test, 0, errors='ignore') self.assertRaises(TypeError, self.type2test, 0, errors='ignore')

View File

@ -783,7 +783,9 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
if (arg == NULL) { if (arg == NULL) {
if (encoding != NULL || errors != NULL) { if (encoding != NULL || errors != NULL) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"encoding or errors without sequence argument"); encoding != NULL ?
"encoding without a string argument" :
"errors without a string argument");
return -1; return -1;
} }
return 0; return 0;
@ -812,7 +814,9 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
/* If it's not unicode, there can't be encoding or errors */ /* If it's not unicode, there can't be encoding or errors */
if (encoding != NULL || errors != NULL) { if (encoding != NULL || errors != NULL) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"encoding or errors without a string argument"); encoding != NULL ?
"encoding without a string argument" :
"errors without a string argument");
return -1; return -1;
} }
@ -860,8 +864,14 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
/* Get the iterator */ /* Get the iterator */
it = PyObject_GetIter(arg); it = PyObject_GetIter(arg);
if (it == NULL) if (it == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
PyErr_Format(PyExc_TypeError,
"cannot convert '%.200s' object to bytearray",
arg->ob_type->tp_name);
}
return -1; return -1;
}
iternext = *Py_TYPE(it)->tp_iternext; iternext = *Py_TYPE(it)->tp_iternext;
/* Run the iterator to exhaustion */ /* Run the iterator to exhaustion */
@ -1626,8 +1636,14 @@ bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints)
} }
it = PyObject_GetIter(iterable_of_ints); it = PyObject_GetIter(iterable_of_ints);
if (it == NULL) if (it == NULL) {
if (PyErr_ExceptionMatches(PyExc_TypeError)) {
PyErr_Format(PyExc_TypeError,
"can't extend bytearray with %.100s",
iterable_of_ints->ob_type->tp_name);
}
return NULL; return NULL;
}
/* Try to determine the length of the argument. 32 is arbitrary. */ /* Try to determine the length of the argument. 32 is arbitrary. */
buf_size = PyObject_LengthHint(iterable_of_ints, 32); buf_size = PyObject_LengthHint(iterable_of_ints, 32);

View File

@ -2537,8 +2537,9 @@ bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (x == NULL) { if (x == NULL) {
if (encoding != NULL || errors != NULL) { if (encoding != NULL || errors != NULL) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"encoding or errors without sequence " encoding != NULL ?
"argument"); "encoding without a string argument" :
"errors without a string argument");
return NULL; return NULL;
} }
return PyBytes_FromStringAndSize(NULL, 0); return PyBytes_FromStringAndSize(NULL, 0);