Skip to content

Commit a399807

Browse files
committed
[GR-10787][GR-10789] add dictview keys and items set operations
PullRequest: graalpython/113
2 parents 5e7ed7f + a7c2d66 commit a399807

File tree

11 files changed

+672
-320
lines changed

11 files changed

+672
-320
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_dict.py

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def test_init():
119119

120120
assert_raises(TypeError, dict.fromkeys, 10)
121121

122+
122123
def test_init1():
123124
try:
124125
dict([("a", 1), ("b", 2)], [("c", 3), ("d", 4)])
@@ -150,17 +151,22 @@ def test_init4():
150151
d = dict(pairs)
151152
assert len(d) == 100000, "invalid length, expected 100.000 but was %d".format(len(d))
152153

154+
153155
def test_init5():
154156
key_set = { 'a', 'b', 'c', 'd' }
157+
155158
class CustomMappingObject:
156159
def __init__(self, keys):
157160
self.__keys = keys
161+
158162
def keys(self):
159163
return self.__keys
164+
160165
def __getitem__(self, key):
161166
if key in self.__keys:
162167
return ord(key)
163168
raise KeyError(key)
169+
164170
def __len__(self):
165171
return len(self.keys)
166172
d = dict(CustomMappingObject(key_set))
@@ -173,8 +179,10 @@ def test_custom_key_object0():
173179
class CollisionKey:
174180
def __init__(self, val):
175181
self.val = val
182+
176183
def __hash__(self):
177184
return 1234
185+
178186
def __eq__(self, other):
179187
if type(other) == type(self):
180188
return self.val == other.val
@@ -240,6 +248,7 @@ def modifying(**kwargs):
240248
kwargs["a"] = 10
241249
kwargs["b"] = 20
242250
return kwargs
251+
243252
def reading(**kwargs):
244253
assert kwargs["a"] == 1
245254
assert kwargs["b"] == 2
@@ -258,20 +267,20 @@ class Foo:
258267
obj = Foo()
259268
d = obj.__dict__
260269
for i in range(200):
261-
attrName = "method" + str(i)
262-
d[attrName] = lambda: attrName
270+
attr_name = "method" + str(i)
271+
d[attr_name] = lambda: attr_name
263272

264273
for i in range(200):
265-
attrName = "method" + str(i)
266-
method_to_call = getattr(obj, attrName)
267-
assert method_to_call() == attrName
274+
attr_name = "method" + str(i)
275+
method_to_call = getattr(obj, attr_name)
276+
assert method_to_call() == attr_name
268277

269278

270279
def test_get_default():
271280
d = {"a": 1}
272281
assert d.get("a") == 1
273282
assert d.get("a", 2) == 1
274-
assert d.get("b") == None
283+
assert d.get("b") is None
275284
assert d.get("b", 2) == 2
276285

277286

@@ -289,3 +298,48 @@ def test_create_seq_and_kw():
289298
d = dict(dict(a=1, b=2, c=3), d=4)
290299
for k in ['a', 'b', 'c', 'd']:
291300
assert k in d
301+
302+
303+
def test_dictview_set_operations_on_keys():
304+
k1 = {1: 1, 2: 2}.keys()
305+
k2 = {1: 1, 2: 2, 3: 3}.keys()
306+
k3 = {4: 4}.keys()
307+
308+
assert k1 - k2 == set()
309+
assert k1 - k3 == {1, 2}
310+
assert k2 - k1 == {3}
311+
assert k3 - k1 == {4}
312+
assert k1 & k2 == {1, 2}
313+
assert k1 & k3 == set()
314+
assert k1 | k2 == {1, 2, 3}
315+
assert k1 ^ k2 == {3}
316+
assert k1 ^ k3 == {1, 2, 4}
317+
318+
319+
def test_dictview_set_operations_on_items():
320+
k1 = {1: 1, 2: 2}.items()
321+
k2 = {1: 1, 2: 2, 3: 3}.items()
322+
k3 = {4: 4}.items()
323+
324+
assert k1 - k2 == set()
325+
assert k1 - k3 == {(1, 1), (2, 2)}
326+
assert k2 - k1 == {(3, 3)}
327+
assert k3 - k1 == {(4, 4)}
328+
assert k1 & k2 == {(1, 1), (2, 2)}
329+
assert k1 & k3 == set()
330+
assert k1 | k2 == {(1, 1), (2, 2), (3, 3)}
331+
assert k1 ^ k2 == {(3, 3)}
332+
assert k1 ^ k3 == {(1, 1), (2, 2), (4, 4)}
333+
334+
335+
def test_dictview_mixed_set_operations():
336+
# Just a few for .keys()
337+
assert {1: 1}.keys() == {1}
338+
assert {1} == {1: 1}.keys()
339+
assert {1: 1}.keys() | {2} == {1, 2}
340+
assert {2} | {1: 1}.keys() == {1, 2}
341+
# And a few for .items()
342+
assert {1: 1}.items() == {(1, 1)}
343+
assert {(1, 1)} == {1: 1}.items()
344+
assert {1: 1}.items() | {2} == {(1, 1), 2}
345+
assert {2} | {1: 1}.items() == {(1, 1), 2}

graalpython/com.oracle.graal.python.test/src/tests/test_set.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,32 @@ def check_pass_thru():
5757
yield 1
5858

5959

60-
def test_set_or():
60+
def test_set_or_union():
6161
s1 = {1, 2, 3}
6262
s2 = {4, 5, 6}
6363
s3 = {1, 2, 4}
6464
s4 = {1, 2, 3}
6565

66-
union = s1 | s2
67-
assert union == {1, 2, 3, 4, 5, 6}
66+
or_result = s1 | s2
67+
union_result = s1.union(s2)
68+
assert or_result == {1, 2, 3, 4, 5, 6}
69+
assert union_result == {1, 2, 3, 4, 5, 6}
6870

69-
union = s1 | s3
70-
assert union == {1, 2, 3, 4}
71+
or_result = s1 | s3
72+
union_result = s1.union(s3)
73+
assert or_result == {1, 2, 3, 4}
74+
assert union_result == {1, 2, 3, 4}
7175

72-
union = s1 | s4
73-
assert union == {1, 2, 3}
76+
or_result = s1 | s4
77+
union_result = s1.union(s4)
78+
assert or_result == {1, 2, 3}
79+
assert union_result == {1, 2, 3}
80+
81+
82+
def test_set_union():
83+
assert {1, 2, 3}.union({1: 'a', 2: 'b', 4: 'd'}) == {1, 2, 3, 4}
84+
assert {1, 2, 3}.union([2, 3, 4, 5]) == {1, 2, 3, 4, 5}
85+
assert {1, 2, 3}.union((3, 4, 5, 6)) == {1, 2, 3, 4, 5, 6}
7486

7587

7688
def test_set_remove():

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,11 @@
8282
import com.oracle.graal.python.builtins.objects.common.HashingStorage.DictEntry;
8383
import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins;
8484
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
85-
import com.oracle.graal.python.builtins.objects.dict.DictItemsBuiltins;
8685
import com.oracle.graal.python.builtins.objects.dict.DictItemsIteratorBuiltins;
87-
import com.oracle.graal.python.builtins.objects.dict.DictKeysBuiltins;
8886
import com.oracle.graal.python.builtins.objects.dict.DictKeysIteratorBuiltins;
8987
import com.oracle.graal.python.builtins.objects.dict.DictValuesBuiltins;
9088
import com.oracle.graal.python.builtins.objects.dict.DictValuesIteratorBuiltins;
89+
import com.oracle.graal.python.builtins.objects.dict.DictViewBuiltins;
9190
import com.oracle.graal.python.builtins.objects.dict.PDict;
9291
import com.oracle.graal.python.builtins.objects.enumerate.EnumerateBuiltins;
9392
import com.oracle.graal.python.builtins.objects.exception.BaseExceptionBuiltins;
@@ -216,11 +215,10 @@ public final class Python3Core implements PythonCore {
216215
new TruffleObjectBuiltins(),
217216
new ListBuiltins(),
218217
new DictBuiltins(),
219-
new DictKeysBuiltins(),
220-
new DictKeysIteratorBuiltins(),
218+
new DictViewBuiltins(),
221219
new DictValuesBuiltins(),
220+
new DictKeysIteratorBuiltins(),
222221
new DictValuesIteratorBuiltins(),
223-
new DictItemsBuiltins(),
224222
new DictItemsIteratorBuiltins(),
225223
new RangeBuiltins(),
226224
new SliceBuiltins(),

0 commit comments

Comments
 (0)