mirror of https://github.com/python/cpython
Issue #21578: Fixed misleading error message when ImportError called with
invalid keyword args.
This commit is contained in:
commit
a6f035ee8d
|
@ -1096,6 +1096,22 @@ class ImportErrorTests(unittest.TestCase):
|
||||||
self.assertEqual(exc.name, 'somename')
|
self.assertEqual(exc.name, 'somename')
|
||||||
self.assertEqual(exc.path, 'somepath')
|
self.assertEqual(exc.path, 'somepath')
|
||||||
|
|
||||||
|
msg = "'invalid' is an invalid keyword argument for this function"
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
ImportError('test', invalid='keyword')
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
ImportError('test', name='name', invalid='keyword')
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
ImportError('test', path='path', invalid='keyword')
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
ImportError(invalid='keyword')
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
|
ImportError('test', invalid='keyword', another=True)
|
||||||
|
|
||||||
def test_non_str_argument(self):
|
def test_non_str_argument(self):
|
||||||
# Issue #15778
|
# Issue #15778
|
||||||
with check_warnings(('', BytesWarning), quiet=True):
|
with check_warnings(('', BytesWarning), quiet=True):
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #21578: Fixed misleading error message when ImportError called with
|
||||||
|
invalid keyword args.
|
||||||
|
|
||||||
- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message.
|
- Issue #28203: Fix incorrect type in complex(1.0, {2:3}) error message.
|
||||||
Patch by Soumya Sharma.
|
Patch by Soumya Sharma.
|
||||||
|
|
||||||
|
|
|
@ -612,36 +612,38 @@ SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
|
||||||
static int
|
static int
|
||||||
ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
|
ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
|
static char *kwlist[] = {"name", "path", 0};
|
||||||
|
PyObject *empty_tuple;
|
||||||
PyObject *msg = NULL;
|
PyObject *msg = NULL;
|
||||||
PyObject *name = NULL;
|
PyObject *name = NULL;
|
||||||
PyObject *path = NULL;
|
PyObject *path = NULL;
|
||||||
|
|
||||||
/* Macro replacement doesn't allow ## to start the first line of a macro,
|
if (BaseException_init((PyBaseExceptionObject *)self, args, NULL) == -1)
|
||||||
so we move the assignment and NULL check into the if-statement. */
|
|
||||||
#define GET_KWD(kwd) { \
|
|
||||||
kwd = PyDict_GetItemString(kwds, #kwd); \
|
|
||||||
if (kwd) { \
|
|
||||||
Py_INCREF(kwd); \
|
|
||||||
Py_XSETREF(self->kwd, kwd); \
|
|
||||||
if (PyDict_DelItemString(kwds, #kwd)) \
|
|
||||||
return -1; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kwds) {
|
|
||||||
GET_KWD(name);
|
|
||||||
GET_KWD(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
|
|
||||||
return -1;
|
|
||||||
if (PyTuple_GET_SIZE(args) != 1)
|
|
||||||
return 0;
|
|
||||||
if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
Py_INCREF(msg);
|
empty_tuple = PyTuple_New(0);
|
||||||
Py_XSETREF(self->msg, msg);
|
if (!empty_tuple)
|
||||||
|
return -1;
|
||||||
|
if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
|
||||||
|
&name, &path)) {
|
||||||
|
Py_DECREF(empty_tuple);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
Py_DECREF(empty_tuple);
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
Py_INCREF(name);
|
||||||
|
Py_XSETREF(self->name, name);
|
||||||
|
}
|
||||||
|
if (path) {
|
||||||
|
Py_INCREF(path);
|
||||||
|
Py_XSETREF(self->path, path);
|
||||||
|
}
|
||||||
|
if (PyTuple_GET_SIZE(args) == 1) {
|
||||||
|
msg = PyTuple_GET_ITEM(args, 0);
|
||||||
|
Py_INCREF(msg);
|
||||||
|
Py_XSETREF(self->msg, msg);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue