diff options
-rw-r--r-- | Lib/test/test_functools.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/_functoolsmodule.c | 13 |
3 files changed, 15 insertions, 2 deletions
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py index e7f34cc721..03dd545736 100644 --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -77,9 +77,11 @@ class TestPartial: # exercise special code paths for no keyword args in # either the partial object or the caller p = self.partial(capture) + self.assertEqual(p.keywords, {}) self.assertEqual(p(), ((), {})) self.assertEqual(p(a=1), ((), {'a':1})) p = self.partial(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 @@ -167,6 +167,8 @@ Library lines from the code object, fixing an issue when a lambda function is used as decorator argument. Patch by Thomas Ballinger and Allison Kaptur. +- The keywords attribute of functools.partial is now always a dictionary. + - Issue #23811: Add missing newline to the PyCompileError error message. Patch by Alex Shkop. diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c index 3413b12dfe..3c82e5134a 100644 --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -102,8 +102,17 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw) } } else { - pto->kw = pkw; - Py_INCREF(pkw); + if (pkw == Py_None) { + pto->kw = PyDict_New(); + if (pto->kw == NULL) { + Py_DECREF(pto); + return NULL; + } + } + else { + pto->kw = pkw; + Py_INCREF(pkw); + } } pto->weakreflist = NULL; |