From e900bd4a07f96f52ebfaba04cb1ca63b8809ddf1 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 6 Oct 2019 14:56:02 +0900 Subject: [PATCH 1/5] bpo-38210: Remove intersection operation with empty set --- Lib/test/test_dictviews.py | 6 ++++++ .../2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst | 2 ++ Objects/dictobject.c | 8 -------- 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index b15cfebc98912d..1fae021b4b1c00 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -158,6 +158,12 @@ def intersection(self, other): self.assertTrue(de.keys().isdisjoint(de.keys())) self.assertTrue(de.keys().isdisjoint([1])) + def test_keys_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}) + def test_items_set_operations(self): d1 = {'a': 1, 'b': 2} d2 = {'a': 2, 'b': 2} 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 index 00000000000000..768c6d4e644a5d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-10-06-15-01-57.bpo-38210.Xgc6F_.rst @@ -0,0 +1,2 @@ +Remove unecessary intersection and update set operation in dictview with +empty set. (Contributed by Dong-hee Na in :issue:`38210`.) diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 2f86946b985f55..5c3f1fb3c1a25e 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -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; } From 211506924ffb4146724bdbef991fa4595861c1e0 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 6 Oct 2019 15:33:09 +0900 Subject: [PATCH 2/5] bpo-38210: Add tests for .items() --- Lib/test/test_dictviews.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 1fae021b4b1c00..570e53844a06b8 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -164,6 +164,11 @@ def test_keys_set_operations_with_iterator(self): 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_items_set_operations(self): d1 = {'a': 1, 'b': 2} d2 = {'a': 2, 'b': 2} From e668e92da4905e20fa021679c2093f2374facddd Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 6 Oct 2019 16:14:19 +0900 Subject: [PATCH 3/5] bpo-38210: Update unittest --- Lib/test/test_dictviews.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 570e53844a06b8..371d2b8d66e344 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -158,17 +158,6 @@ def intersection(self, other): self.assertTrue(de.keys().isdisjoint(de.keys())) self.assertTrue(de.keys().isdisjoint([1])) - def test_keys_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_items_set_operations(self): d1 = {'a': 1, 'b': 2} d2 = {'a': 2, 'b': 2} @@ -225,6 +214,16 @@ def test_items_set_operations(self): 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, 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() From dfd7a76754d5e858b42fdafbb68583bbbfff6df9 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 6 Oct 2019 16:53:53 +0900 Subject: [PATCH 4/5] bpo-38210: Update the unittest --- Lib/test/test_dictviews.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 371d2b8d66e344..0ddfe8f7ee5476 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -216,6 +216,7 @@ def test_items_set_operations(self): 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}) From 1797c9fd822ec85e9143367cfb7cc43b216b5031 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Sun, 6 Oct 2019 16:55:07 +0900 Subject: [PATCH 5/5] bpo-38210: Remove redundant expressions --- Lib/test/test_dictviews.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index 0ddfe8f7ee5476..7cf019250244bd 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -216,14 +216,14 @@ def test_items_set_operations(self): 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}) + 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)}) + 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 = {}