from __future__ import print_function import sys, os import json class Container(dict): __slots__ = "__protected__", def __init__(self, *args, **kwargs): super(self.__class__, self).__init__(*args, **kwargs) self.__protected__ = False @property def protected(self): return self.__protected__ @protected.setter def protected(self, v): self.__protected__ = bool(v) def __getattr__(self, item): if item in self: return self[item] raise AttributeError("(getattr) Attribute or key '{}' not in {}" .format(item, self.__class__)) def __setattr__(self, key, value): if hasattr(dict, key) or key.startswith("__"): return super(self.__class__, self).__setattr__(key, value) if self.__protected__: raise AttributeError("(setattr) Attribute or key '{}' not in protected {}" .format(key, self.__class__)) self[key] = value def as_json(self): """ Return Containers content in json-format. """ return json.dumps(self) def write(self, out=sys.stdout, overwrite=False): """ Write Container content to file (or stdout by default) in json-format. """ closeflag = False if isinstance(out, basestring): if not overwrite and os.path.exists(out): raise IOError("Can't overwrite: '{}'" .format(out)) out = open(out, "w") closeflag = True print(self.as_json(), file=out) if closeflag: out.close() def protect(self): """ Don't allow new keys. """ self.protected = True def unprotect(self): """ Protection dismissed. """ self.protected = False