From: Benjamin Peterson Date: Sat, 9 May 2015 04:23:41 +0000 (-0400) Subject: ensure .keywords is always a dict X-Git-Tag: v2.7.10rc1~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72c0141f03f723fe5269cb9cdcb1541a4c6811e8;p=python ensure .keywords is always a dict --- diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index c0a9a3b8f5..7b3cb96497 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -89,9 +89,11 @@ class TestPartial(unittest.TestCase): # exercise special code paths for no keyword args in # either the partial object or the caller p = self.thetype(capture) + self.assertEqual(p.keywords, {}) self.assertEqual(p(), ((), {})) self.assertEqual(p(a=1), ((), {'a':1})) p = self.thetype(capture, a=1) + self.assertEqual(p.keywords, {'a':1}) self.assertEqual(p(), ((), {'a':1})) self.assertEqual(p(b=2), ((), {'a':1, 'b':2})) # keyword args in the call override those in the partial object diff --git a/Misc/NEWS b/Misc/NEWS index e76f18710c..b5a149c9b4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,8 @@ Core and Builtins Library ------- +- The keywords attribute of functools.partial is now always a dictionary. + - Issue #24134: assertRaises() and assertRaisesRegexp() checks are not longer successful if the callable is None. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 6397ba951d..2ba92bae9d 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -132,17 +132,13 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) Py_DECREF(pto); return NULL; } - if (kw != NULL) { - pto->kw = PyDict_Copy(kw); - if (pto->kw == NULL) { - Py_DECREF(pto); - return NULL; - } - } else { - pto->kw = Py_None; - Py_INCREF(Py_None); + pto->kw = (kw != NULL) ? PyDict_Copy(kw) : PyDict_New(); + if (pto->kw == NULL) { + Py_DECREF(pto); + return NULL; } + pto->weakreflist = NULL; pto->dict = NULL;