# encoding: utf-8 """Miscellaneous context managers. """ import warnings # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. 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): # Actions to perform upon exiting. 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) class NoOpContext(object): """ Deprecated Context manager that does nothing.""" def __init__(self): warnings.warn("""NoOpContext is deprecated since IPython 5.0 """, DeprecationWarning, stacklevel=2) def __enter__(self): pass def __exit__(self, type, value, traceback): pass