diff --git a/.gitignore b/.gitignore index b41c71a..298a242 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ Pipfile test/core.* .eggs/ .idea/ +.vs/ diff --git a/src/frozendict/cool.py b/src/frozendict/cool.py index 8639059..b38d027 100644 --- a/src/frozendict/cool.py +++ b/src/frozendict/cool.py @@ -287,10 +287,15 @@ def deepfreeze( custom_inverse_converters = custom_inverse_converters ) - if frozen_type: - return type_o(o) + try: + freeze = freeze_conversion_map[base_type_o] + except KeyError: + if frozen_type: + freeze = type_o + else: + raise - return freeze_conversion_map[base_type_o](o) + return freeze(o) __all__ = ( diff --git a/test/test_freeze.py b/test/test_freeze.py index 1e466e6..fcd85a3 100644 --- a/test/test_freeze.py +++ b/test/test_freeze.py @@ -2,6 +2,7 @@ import frozendict as cool from frozendict import frozendict from collections import OrderedDict +from collections.abc import MutableSequence, Sequence from array import array from types import MappingProxyType from frozendict import FreezeError, FreezeWarning @@ -12,6 +13,38 @@ def __init__(self, x): self.x = x +class BaseSeq(Sequence): + + def __init__(self, seq): + self._items = list(seq) + + def __getitem__(self, i): + return self._items[i] + + def __len__(self): + return len(self._items) + + +class FrozenSeqA(BaseSeq): + pass + + +class FrozenSeqB(BaseSeq): + pass + + +class MutableSeq(BaseSeq, MutableSequence): + + def __delitem__(self, i): + del self._items[i] + + def __setitem__(self, i, v): + self._items[i] = v + + def insert(self, index, value): + self._items.insert(index, value) + + def custom_a_converter(a): return frozendict(**a.__dict__, y="mbuti") @@ -138,3 +171,14 @@ def test_register_inverse(before_cure_inverse, after_cure_inverse): ) assert cool.deepfreeze(before_cure_inverse) == after_cure_inverse + + +def test_prefer_forward(): + assert isinstance( + cool.deepfreeze( + [FrozenSeqA((0, 1, 2))], + custom_converters={FrozenSeqA: FrozenSeqB}, + custom_inverse_converters={FrozenSeqA: MutableSeq} + )[0], + FrozenSeqB + ) \ No newline at end of file