Issue #21578: Fixed misleading error message when ImportError called with

invalid keyword args.
This commit is contained in:
Serhiy Storchaka 2016-09-27 20:51:27 +03:00
commit a6f035ee8d
3 changed files with 45 additions and 24 deletions

View File

@ -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):

View File

@ -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.

View File

@ -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;
} }