]> granicus.if.org Git - python/commitdiff
bpo-38210: Fix intersection operation with dict view and iterator. (GH-16602)
authorDong-hee Na <donghee.na92@gmail.com>
Sun, 6 Oct 2019 11:28:33 +0000 (20:28 +0900)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 6 Oct 2019 11:28:33 +0000 (14:28 +0300)
Lib/test/test_dictviews.py
Misc/NEWS.d/next/Core and Builtins/2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst [new file with mode: 0644]
Objects/dictobject.c

index b15cfebc98912d52c9b3760c251b9d9c2abb2859..7cf019250244bd5f7e9dea8372f3f736f101777f 100644 (file)
@@ -214,6 +214,17 @@ class DictSetTest(unittest.TestCase):
         self.assertTrue(de.items().isdisjoint(de.items()))
         self.assertTrue(de.items().isdisjoint([1]))
 
+    def test_set_operations_with_iterator(self):
+        origin = {1: 2, 3: 4}
+        self.assertEqual(origin.keys() & iter([1, 2]), {1})
+        self.assertEqual(origin.keys() | iter([1, 2]), {1, 2, 3})
+        self.assertEqual(origin.keys() ^ iter([1, 2]), {2, 3})
+
+        items = origin.items()
+        self.assertEqual(items & iter([(1, 2)]), {(1, 2)})
+        self.assertEqual(items ^ iter([(1, 2)]), {(3, 4)})
+        self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)})
+
     def test_recursive_repr(self):
         d = {}
         d[42] = d.values()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst b/Misc/NEWS.d/next/Core and Builtins/2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst
new file mode 100644 (file)
index 0000000..768c6d4
--- /dev/null
@@ -0,0 +1,2 @@
+Remove unecessary intersection and update set operation in dictview with
+empty set. (Contributed by Dong-hee Na in :issue:`38210`.)
index 2f86946b985f551b3b512df45eb8acc24ea5fce6..5c3f1fb3c1a25e24a4a0d585a6af652b7f8a8ad8 100644 (file)
@@ -4225,14 +4225,6 @@ _PyDictView_Intersect(PyObject* self, PyObject *other)
 
     it = PyObject_GetIter(other);
 
-    _Py_IDENTIFIER(intersection_update);
-    tmp = _PyObject_CallMethodIdOneArg(result, &PyId_intersection_update, other);
-    if (tmp == NULL) {
-        Py_DECREF(result);
-        return NULL;
-    }
-    Py_DECREF(tmp);
-
     if (PyDictKeys_Check(self)) {
         dict_contains = dictkeys_contains;
     }