py/objdict: Implement dictionary union (PEP 584).

Implements dictionary union according to PEP 584's specifications, minus
the fact that dictionary entries are not guaranteed to be in insertion
order.  This feature is enabled with MICROPY_CPYTHON_COMPAT.

Includes a new test.

With the assistance of Fangrui Qin <qinf@purdue.edu>

Signed-off-by: Rayane Chatrieux <rayane.chatrieux@gmail.com>
Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Rayane Chatrieux
2022-04-11 17:35:56 -04:00
committed by Damien George
parent 7fe7c55bb8
commit f3e4c505d1
3 changed files with 59 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# Test dictionary union.
#
# The tests sort the resulting dictionaries for now, since map insertion
# order is not implemented in MicroPython.
try:
{} | {}
except TypeError:
print("SKIP")
raise SystemExit
def print_sorted_dict(d):
print(sorted(d.items()))
def test_union(a, b):
print_sorted_dict(a | b)
print_sorted_dict(b | a)
a |= a
print_sorted_dict(a)
a |= b
print_sorted_dict(a)
d = {}
e = {}
test_union(d, e)
d = {1: "apple"}
e = {1: "cheese"}
test_union(d, e)
d = {"spam": 1, "eggs": 2, "cheese": 3}
e = {"cheese": "cheddar", "aardvark": "Ethel"}
test_union(d, e)

View File

@@ -0,0 +1,12 @@
[]
[]
[]
[]
[(1, 'cheese')]
[(1, 'apple')]
[(1, 'apple')]
[(1, 'cheese')]
[('aardvark', 'Ethel'), ('cheese', 'cheddar'), ('eggs', 2), ('spam', 1)]
[('aardvark', 'Ethel'), ('cheese', 3), ('eggs', 2), ('spam', 1)]
[('cheese', 3), ('eggs', 2), ('spam', 1)]
[('aardvark', 'Ethel'), ('cheese', 'cheddar'), ('eggs', 2), ('spam', 1)]