Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #28157

Context manager to save/restore a name binding

From Ben Finney <ben+python@benfinney.id.au>
Newsgroups comp.lang.python
Subject Context manager to save/restore a name binding
Date 2012-08-31 12:36 +1000
Message-ID <87oblrbxea.fsf@benfinney.id.au> (permalink)
Organization Unlimited download news at news.astraweb.com

Show all headers | View raw


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

Back to comp.lang.python | Previous | NextNext in thread | Find similar | Unroll thread


Thread

Context manager to save/restore a name binding Ben Finney <ben+python@benfinney.id.au> - 2012-08-31 12:36 +1000
  Re: Context manager to save/restore a name binding Peter Otten <__peter__@web.de> - 2012-08-31 08:27 +0200
    Re: Context manager to save/restore a name binding Ben Finney <ben+python@benfinney.id.au> - 2012-08-31 19:32 +1000
  Re: Context manager to save/restore a name binding Chris Withers <chris@python.org> - 2012-08-31 12:06 +0100

csiph-web