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