diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 818c99ed3bb..1507e420538 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -8,10 +8,13 @@ import gc, weakref class DictTest(unittest.TestCase): def test_invalid_keyword_arguments(self): - with self.assertRaises(TypeError): - dict(**{1 : 2}) - with self.assertRaises(TypeError): - {}.update(**{1 : 2}) + class Custom(dict): + pass + for invalid in {1 : 2}, Custom({1 : 2}): + with self.assertRaises(TypeError): + dict(**invalid) + with self.assertRaises(TypeError): + {}.update(**invalid) def test_constructor(self): # calling built-in types without argument must return empty diff --git a/Misc/NEWS b/Misc/NEWS index 9f47ca339cb..bf660ccc0e4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,6 +26,11 @@ Library - Issue #10429: IMAP.starttls() stored the capabilities as bytes objects, rather than strings. +C-API +----- + +- Loosen PyArg_ValidateKeywordArguments to allow dict subclasses. + What's New in Python 3.2 Alpha 4? ================================= diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 10157728984..df8d77f313d 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -454,7 +454,7 @@ _PyDict_HasOnlyStringKeys(PyObject *dict) { Py_ssize_t pos = 0; PyObject *key, *value; - assert(PyDict_CheckExact(dict)); + assert(PyDict_Check(dict)); /* Shortcut */ if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode) return 1; diff --git a/Python/getargs.c b/Python/getargs.c index abf55ce041a..cf9869965c2 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1394,7 +1394,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, int PyArg_ValidateKeywordArguments(PyObject *kwargs) { - if (!PyDict_CheckExact(kwargs)) { + if (!PyDict_Check(kwargs)) { PyErr_BadInternalCall(); return 0; }