Bi-directional dictionary

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__()