copy: Support copy and deepcopy of OrderedDict objects.

Signed-off-by: Damien George <damien@micropython.org>
pull/205/merge
Damien George 2020-07-07 10:56:10 +10:00
rodzic b89114c834
commit 6b985bbc1b
1 zmienionych plików z 10 dodań i 1 usunięć

Wyświetl plik

@ -57,6 +57,11 @@ class Error(Exception):
pass pass
error = Error # backward compatibility error = Error # backward compatibility
try:
from ucollections import OrderedDict
except ImportError:
OrderedDict = None
try: try:
from org.python.core import PyStringMap from org.python.core import PyStringMap
except ImportError: except ImportError:
@ -121,6 +126,8 @@ def _copy_with_constructor(x):
return type(x)(x) return type(x)(x)
for t in (list, dict, set): for t in (list, dict, set):
d[t] = _copy_with_constructor d[t] = _copy_with_constructor
if OrderedDict is not None:
d[OrderedDict] = _copy_with_constructor
def _copy_with_copy_method(x): def _copy_with_copy_method(x):
return x.copy() return x.copy()
@ -235,12 +242,14 @@ def _deepcopy_tuple(x, memo):
d[tuple] = _deepcopy_tuple d[tuple] = _deepcopy_tuple
def _deepcopy_dict(x, memo): def _deepcopy_dict(x, memo):
y = {} y = type(x)()
memo[id(x)] = y memo[id(x)] = y
for key, value in x.items(): for key, value in x.items():
y[deepcopy(key, memo)] = deepcopy(value, memo) y[deepcopy(key, memo)] = deepcopy(value, memo)
return y return y
d[dict] = _deepcopy_dict d[dict] = _deepcopy_dict
if OrderedDict is not None:
d[OrderedDict] = _deepcopy_dict
if PyStringMap is not None: if PyStringMap is not None:
d[PyStringMap] = _deepcopy_dict d[PyStringMap] = _deepcopy_dict