Skip to content

Commit c38e725

Browse files
corona10serhiy-storchaka
authored andcommitted
bpo-38210: Fix intersection operation with dict view and iterator. (GH-16602)
1 parent 65dcc8a commit c38e725

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

Lib/test/test_dictviews.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,17 @@ def test_items_set_operations(self):
214214
self.assertTrue(de.items().isdisjoint(de.items()))
215215
self.assertTrue(de.items().isdisjoint([1]))
216216

217+
def test_set_operations_with_iterator(self):
218+
origin = {1: 2, 3: 4}
219+
self.assertEqual(origin.keys() & iter([1, 2]), {1})
220+
self.assertEqual(origin.keys() | iter([1, 2]), {1, 2, 3})
221+
self.assertEqual(origin.keys() ^ iter([1, 2]), {2, 3})
222+
223+
items = origin.items()
224+
self.assertEqual(items & iter([(1, 2)]), {(1, 2)})
225+
self.assertEqual(items ^ iter([(1, 2)]), {(3, 4)})
226+
self.assertEqual(items | iter([(1, 2)]), {(1, 2), (3, 4)})
227+
217228
def test_recursive_repr(self):
218229
d = {}
219230
d[42] = d.values()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Remove unecessary intersection and update set operation in dictview with
2+
empty set. (Contributed by Dong-hee Na in :issue:`38210`.)

Objects/dictobject.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4225,14 +4225,6 @@ _PyDictView_Intersect(PyObject* self, PyObject *other)
42254225

42264226
it = PyObject_GetIter(other);
42274227

4228-
_Py_IDENTIFIER(intersection_update);
4229-
tmp = _PyObject_CallMethodIdOneArg(result, &PyId_intersection_update, other);
4230-
if (tmp == NULL) {
4231-
Py_DECREF(result);
4232-
return NULL;
4233-
}
4234-
Py_DECREF(tmp);
4235-
42364228
if (PyDictKeys_Check(self)) {
42374229
dict_contains = dictkeys_contains;
42384230
}

0 commit comments

Comments
 (0)