handle dict subclasses gracefully in PyArg_ValidateKeywordArguments

This commit is contained in:
Benjamin Peterson 2010-11-17 22:33:12 +00:00
parent 12ae290bf3
commit f609654b0e
4 changed files with 14 additions and 6 deletions

View File

@ -8,10 +8,13 @@ import gc, weakref
class DictTest(unittest.TestCase):
def test_invalid_keyword_arguments(self):
class Custom(dict):
pass
for invalid in {1 : 2}, Custom({1 : 2}):
with self.assertRaises(TypeError):
dict(**{1 : 2})
dict(**invalid)
with self.assertRaises(TypeError):
{}.update(**{1 : 2})
{}.update(**invalid)
def test_constructor(self):
# calling built-in types without argument must return empty

View File

@ -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?
=================================

View File

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

View File

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