import weakref class RemovableHandle(object): """A handle which provides the capability to remove a hook.""" next_id = 0 def __init__(self, hooks_dict): self.hooks_dict_ref = weakref.ref(hooks_dict) self.id = RemovableHandle.next_id RemovableHandle.next_id += 1 def remove(self): hooks_dict = self.hooks_dict_ref() if hooks_dict is not None and self.id in hooks_dict: del hooks_dict[self.id] def __enter__(self): return self def __exit__(self, type, value, tb): self.remove()