diff options
Diffstat (limited to 'game/python-extra/utils/dicts/limited_dict.py')
-rw-r--r-- | game/python-extra/utils/dicts/limited_dict.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/game/python-extra/utils/dicts/limited_dict.py b/game/python-extra/utils/dicts/limited_dict.py new file mode 100644 index 0000000..c690118 --- /dev/null +++ b/game/python-extra/utils/dicts/limited_dict.py @@ -0,0 +1,40 @@ +from collections import MutableMapping + + +class LimitedDict(MutableMapping): + def __init__(self, args=None, **kwargs): + keys = kwargs.pop('keys', []) + self.__keys = keys + + self.__data = {} + + if args: + kwargs.update((key, val) for key, val in args) + + for key, val in kwargs.items(): + self[key] = val + + def __setitem__(self, key, val): + if key not in self.__keys: + raise KeyError("Illegal key: {}".format(key)) + + self.__data[key] = val + + def __getitem__(self, key): + return self.__data[key] + + def __iter__(self): + return self.__data.__iter__() + + def __delitem__(self, key): + del self.__data[key] + + def __len__(self): + return len(self.__data) + + def __repr__(self): + return "{}({}, {})".format(self.__class__.__name__, self.defined_keys, self.__data) + + @property + def defined_keys(self): + return self.__keys |