| |
| """Miscellaneous context managers. |
| """ |
|
|
| import warnings |
|
|
| |
| |
|
|
|
|
| class preserve_keys(object): |
| """Preserve a set of keys in a dictionary. |
| |
| Upon entering the context manager the current values of the keys |
| will be saved. Upon exiting, the dictionary will be updated to |
| restore the original value of the preserved keys. Preserved keys |
| which did not exist when entering the context manager will be |
| deleted. |
| |
| Examples |
| -------- |
| |
| >>> d = {'a': 1, 'b': 2, 'c': 3} |
| >>> with preserve_keys(d, 'b', 'c', 'd'): |
| ... del d['a'] |
| ... del d['b'] # will be reset to 2 |
| ... d['c'] = None # will be reset to 3 |
| ... d['d'] = 4 # will be deleted |
| ... d['e'] = 5 |
| ... print(sorted(d.items())) |
| ... |
| [('c', None), ('d', 4), ('e', 5)] |
| >>> print(sorted(d.items())) |
| [('b', 2), ('c', 3), ('e', 5)] |
| """ |
|
|
| def __init__(self, dictionary, *keys): |
| self.dictionary = dictionary |
| self.keys = keys |
|
|
| def __enter__(self): |
| |
| to_delete = [] |
| to_update = {} |
|
|
| d = self.dictionary |
| for k in self.keys: |
| if k in d: |
| to_update[k] = d[k] |
| else: |
| to_delete.append(k) |
|
|
| self.to_delete = to_delete |
| self.to_update = to_update |
|
|
| def __exit__(self, *exc_info): |
| d = self.dictionary |
|
|
| for k in self.to_delete: |
| d.pop(k, None) |
| d.update(self.to_update) |
|
|