import os import json class BiDict(dict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.inverse = {} for key, value in self.items(): self.inverse.setdefault(value,key) def __setitem__(self, key, value): if key in self : del self.inverse[self[key]] super().__setitem__(key, value) self.inverse.setdefault(value,key) def __delitem__(self, key): value = self[key] if value in self.inverse : del self.inverse[value] super().__delitem__(key) def pop(self,key): value = super().pop(key) self.inverse.pop(value) return value def load(self, path, name): assert os.path.isdir(path), f'dir: {path} does not exists' full = f'{path}/{name}' with open(full,'r') as fh : self.__init__(json.load(fh)) def save(self, path, name): assert os.path.isdir(path), f'dir: {path} does not exists' full = f'{path}/{name}' with open(full,'w') as fh : json.dump(self, fh, sort_keys=True, indent=2) class AttrBiDict(BiDict): def __init__(self, *args, **kwargs): super(AttrBiDict, self).__init__(*args, **kwargs) self.__dict__ = self def __hash__(self): return hash(str(self)) def __eq__(self,other): return self.__hash__() == other.__hash__()