diff options
author | Benjamin Peterson <benjamin@python.org> | 2010-11-17 22:33:12 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2010-11-17 22:33:12 (GMT) |
commit | f609654b0e36796275b7c9f822349e89fe9b4f2d (patch) | |
tree | be7d4cf8c94b36c9ea48bebd9589b4ca5e8e0954 | |
parent | 12ae290bf32adbc8f4885ec342f5a17a4955fe15 (diff) | |
download | cpython-f609654b0e36796275b7c9f822349e89fe9b4f2d.zip cpython-f609654b0e36796275b7c9f822349e89fe9b4f2d.tar.gz cpython-f609654b0e36796275b7c9f822349e89fe9b4f2d.tar.bz2 |
handle dict subclasses gracefully in PyArg_ValidateKeywordArguments
-rw-r--r-- | Lib/test/test_dict.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Objects/dictobject.c | 2 | ||||
-rw-r--r-- | Python/getargs.c | 2 |
4 files changed, 14 insertions, 6 deletions
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 818c99e..1507e42 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 @@ -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 1015772..df8d77f 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 abf55ce..cf98699 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; } |