summaryrefslogtreecommitdiff
path: root/frozendict/__init__.py
diff options
context:
space:
mode:
authorEeo Jun <packwolf58@gmail.com>2016-04-27 20:23:57 +0800
committerEeo Jun <packwolf58@gmail.com>2016-04-27 20:23:57 +0800
commitde2d597dfe7b7551fdbd1220d1c265254ccb3266 (patch)
tree7f1f65b0f7958db84cfad2262b7ac6c08b5d6fbb /frozendict/__init__.py
parent18e095cd0ed350e7ce5ee548340a42eadaeffb95 (diff)
Keep things simple and DRY
Diffstat (limited to 'frozendict/__init__.py')
-rw-r--r--frozendict/__init__.py53
1 files changed, 14 insertions, 39 deletions
diff --git a/frozendict/__init__.py b/frozendict/__init__.py
index 9598f10..2bc90c6 100644
--- a/frozendict/__init__.py
+++ b/frozendict/__init__.py
@@ -6,66 +6,41 @@ import functools
class frozendict(collections.Mapping):
def __init__(self, *args, **kwargs):
- self.__dict = dict(*args, **kwargs)
- self.__hash = None
+ self._dict = dict(*args, **kwargs)
+ self._hash = None
def __getitem__(self, key):
- return self.__dict[key]
+ return self._dict[key]
def __contains__(self, key):
- return key in self.__dict
+ return key in self._dict
def copy(self, **add_or_replace):
- return frozendict(self, **add_or_replace)
+ return self.__class__(self, **add_or_replace)
def __iter__(self):
- return iter(self.__dict)
+ return iter(self._dict)
def __len__(self):
- return len(self.__dict)
+ return len(self._dict)
def __repr__(self):
- return '<frozendict %s>' % repr(self.__dict)
+ return '<%s %r>' % (self.__class__.__name__, self._dict)
def __hash__(self):
- if self.__hash is None:
+ if self._hash is None:
hashes = map(hash, self.items())
- self.__hash = functools.reduce(operator.xor, hashes, 0)
+ self._hash = functools.reduce(operator.xor, hashes, 0)
- return self.__hash
+ return self._hash
-class FrozenOrderedDict(collections.Mapping):
+class FrozenOrderedDict(frozendict):
"""
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 = collections.OrderedDict(*args, **kwargs)
- self.__hash = None
-
- def __getitem__(self, key):
- return self.__dict[key]
-
- def __contains__(self, key):
- return key in self.__dict
-
- def copy(self, **add_or_replace):
- return FrozenOrderedDict(self, **add_or_replace)
-
- def __iter__(self):
- return iter(self.__dict)
-
- def __len__(self):
- return len(self.__dict)
-
- def __repr__(self):
- return '<FrozenOrderedDict %s>' % repr(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
+ self._dict = collections.OrderedDict(*args, **kwargs)
+ self._hash = None