75 lines
1.9 KiB
Python
75 lines
1.9 KiB
Python
|
# encoding: utf-8
|
||
|
"""Miscellaneous context managers.
|
||
|
"""
|
||
|
|
||
|
import warnings
|
||
|
|
||
|
# Copyright (c) yap_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 yap_ipython 5.0 """,
|
||
|
DeprecationWarning, stacklevel=2)
|
||
|
|
||
|
def __enter__(self): pass
|
||
|
def __exit__(self, type, value, traceback): pass
|