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