sea/datatypes.py
from itertools import repeat
def is_immutable(self):
raise TypeError('%r objects are immutable' % self.__class__.__name__)
class ImmutableDict(dict):
_hash_cache = None
@classmethod
def fromkeys(cls, keys, value=None):
return cls(zip(keys, repeat(value)))
def __reduce_ex__(self, protocol):
return type(self), (dict(self),)
def __hash__(self):
if self._hash_cache is not None:
return self._hash_cache
rv = self._hash_cache = hash(frozenset(self.items()))
return rv
def setdefault(self, key, default=None):
is_immutable(self)
def update(self, *args, **kwargs):
is_immutable(self)
def pop(self, key, default=None):
is_immutable(self)
def popitem(self):
is_immutable(self)
def __setitem__(self, key, value):
is_immutable(self)
def __delitem__(self, key):
is_immutable(self)
def clear(self):
is_immutable(self)
def __repr__(self):
return '%s(%s)' % (
self.__class__.__name__,
dict.__repr__(self),
)
def copy(self):
"""Return a shallow mutable copy of this object. Keep in mind that
the standard library's :func:`copy` function is a no-op for this class
like for any other python immutable type (eg: :class:`tuple`).
"""
return dict(self)
def __copy__(self):
return self
class ConstantsObject(ImmutableDict):
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
self[name] = value
def __dir__(self):
return self.keys()