summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-09-27 17:51:04 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-09-27 17:51:04 (GMT)
commit389ef9dcdabe3ed83023ea50deff4b1cd3927dd3 (patch)
tree9d1e729ee68e6c16c02879b961fc7fe217dbdd74
parenta12e7842a5f572afd6bde108f24931f9262f38ef (diff)
parent47dee11ba76a12d22277562b9ccea51259a5ecc0 (diff)
downloadcpython-389ef9dcdabe3ed83023ea50deff4b1cd3927dd3.zip
cpython-389ef9dcdabe3ed83023ea50deff4b1cd3927dd3.tar.gz
cpython-389ef9dcdabe3ed83023ea50deff4b1cd3927dd3.tar.bz2
Issue #21578: Fixed misleading error message when ImportError called with
invalid keyword args.
-rw-r--r--Lib/test/test_exceptions.py16
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/exceptions.c46
3 files changed, 43 insertions, 22 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 458ddc1..4837922 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -1096,6 +1096,22 @@ class ImportErrorTests(unittest.TestCase):
self.assertEqual(exc.name, 'somename')
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):
# Issue #15778
with check_warnings(('', BytesWarning), quiet=True):
diff --git a/Misc/NEWS b/Misc/NEWS
index 7cbc98c..67b2274 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 2
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.
Patch by Soumya Sharma.
diff --git a/Objects/exceptions.c b/Objects/exceptions.c
index 6fb5eb7..f63f06a 100644
--- a/Objects/exceptions.c
+++ b/Objects/exceptions.c
@@ -612,36 +612,38 @@ SimpleExtendsException(PyExc_BaseException, KeyboardInterrupt,
static int
ImportError_init(PyImportErrorObject *self, PyObject *args, PyObject *kwds)
{
+ static char *kwlist[] = {"name", "path", 0};
+ PyObject *empty_tuple;
PyObject *msg = NULL;
PyObject *name = NULL;
PyObject *path = NULL;
-/* Macro replacement doesn't allow ## to start the first line of a macro,
- 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, NULL) == -1)
+ return -1;
- if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1)
+ empty_tuple = PyTuple_New(0);
+ if (!empty_tuple)
return -1;
- if (PyTuple_GET_SIZE(args) != 1)
- return 0;
- if (!PyArg_UnpackTuple(args, "ImportError", 1, 1, &msg))
+ if (!PyArg_ParseTupleAndKeywords(empty_tuple, kwds, "|$OO:ImportError", kwlist,
+ &name, &path)) {
+ Py_DECREF(empty_tuple);
return -1;
+ }
+ Py_DECREF(empty_tuple);
- Py_INCREF(msg);
- Py_XSETREF(self->msg, msg);
+ 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;
}