Source code for luigi.freezing

"""Internal-only module with immutable data structures.

Please, do not use it outside of Luigi codebase itself.
"""


from collections import OrderedDict
try:
    from collections.abc import Mapping
except ImportError:
    from collections import Mapping
import operator
import functools


[docs] class FrozenOrderedDict(Mapping): """ It is an immutable wrapper around ordered dictionaries that implements the complete :py:class:`collections.Mapping` interface. It can be used as a drop-in replacement for dictionaries where immutability and ordering are desired. """ def __init__(self, *args, **kwargs): self.__dict = OrderedDict(*args, **kwargs) self.__hash = None def __getitem__(self, key): return self.__dict[key] def __iter__(self): return iter(self.__dict) def __len__(self): return len(self.__dict) def __repr__(self): # We should use short representation for beautiful console output return repr(dict(self.__dict)) def __hash__(self): if self.__hash is None: hashes = map(hash, self.items()) self.__hash = functools.reduce(operator.xor, hashes, 0) return self.__hash
[docs] def get_wrapped(self): return self.__dict
[docs] def recursively_freeze(value): """ Recursively walks ``Mapping``s and ``list``s and converts them to ``FrozenOrderedDict`` and ``tuples``, respectively. """ if isinstance(value, Mapping): return FrozenOrderedDict(((k, recursively_freeze(v)) for k, v in value.items())) elif isinstance(value, list) or isinstance(value, tuple): return tuple(recursively_freeze(v) for v in value) return value
[docs] def recursively_unfreeze(value): """ Recursively walks ``FrozenOrderedDict``s and ``tuple``s and converts them to ``dict`` and ``list``, respectively. """ if isinstance(value, Mapping): return dict(((k, recursively_unfreeze(v)) for k, v in value.items())) elif isinstance(value, list) or isinstance(value, tuple): return list(recursively_unfreeze(v) for v in value) return value