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__()
Tags: bidictdicthashtwo-way