[Python-checkins] cpython (3.4): ensure .keywords is always a dict

benjamin.peterson python-checkins at python.org
Sat May 9 06:29:12 CEST 2015


https://hg.python.org/cpython/rev/9dfda4e7169a
changeset:   95929:9dfda4e7169a
branch:      3.4
parent:      95926:c78137bff841
user:        Benjamin Peterson <benjamin at python.org>
date:        Sat May 09 00:25:18 2015 -0400
summary:
  ensure .keywords is always a dict

files:
  Lib/test/test_functools.py |   2 ++
  Misc/NEWS                  |   2 ++
  Modules/_functoolsmodule.c |  14 +++++---------
  3 files changed, 9 insertions(+), 9 deletions(-)


diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -77,9 +77,11 @@
         # 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
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -57,6 +57,8 @@
 - Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes.
   Patch written by William Orr.
 
+- The keywords attribute of functools.partial is now always a dictionary.
+
 - Issues #24099, #24100, and #24101: Fix free-after-use bug in heapq's siftup
   and siftdown functions.
 
diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c
--- a/Modules/_functoolsmodule.c
+++ b/Modules/_functoolsmodule.c
@@ -54,17 +54,13 @@
         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;
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list