Context manager to save/restore a name binding
Ben Finney
ben+python at benfinney.id.au
Thu Aug 30 22:36:29 EDT 2012
Howdy all,
I have written a context manager to save and restore a name binding::
import contextlib
@contextlib.contextmanager
def preserve_value(namespace, name):
""" A context manager to preserve, then restore, the specified binding.
:param namespace: The namespace object (e.g. a class or dict)
containing the name binding.
:param name: The name of the binding to be preserved.
:yield: None.
When the context manager is entered, the current value bound to `name`
in `namespace` is saved. When the context manager is exited, the
binding is re-established to the saved value.
"""
saved_value = getattr(namespace, name)
yield
setattr(namespace, name, saved_value)
The use case is <URL: http://stackoverflow.com/a/6811921/70157>, where
it's used like this::
with preserve_value(sys, 'dont_write_bytecode'):
sys.dont_write_bytecode = True
module = imp.load_module(…)
That way, I can set ‘sys.dont_write_bytecode’ to the value I need in
this part of the code, knowing that however the code continues the
previous value of that setting will be restored to whatever it was
before I touched it.
Have I re-invented a context manager which already exists? Is there a
better way to do what ‘preserve_value’ is doing?
--
\ “When a well-packaged web of lies has been sold to the masses |
`\ over generations, the truth will seem utterly preposterous and |
_o__) its speaker a raving lunatic.” —Dresden James |
Ben Finney
More information about the Python-list
mailing list