Carl K wrote: > Is there a more elegant way of coding this: > > x=o.p # save .p > o.p=0 > o.m() > o.p=x # restore .p > > seems very push/pop to me - like there should be a way that doesn't need > a var (x) or the save/set lines should be done in one command.
With the appropriate context manger, you could write this as:: with setting(o, 'p', 2): o.m() Here's the code:: >>> from __future__ import with_statement >>> @contextlib.contextmanager ... def setting(obj, name, value): ... old_value = getattr(obj, name) ... setattr(obj, name, value) ... try: ... yield obj ... finally: ... setattr(obj, name, old_value) ... >>> class C(object): ... def __init__(self, x): ... self.x = x ... def m(self): ... print self.x ... >>> c = C(1) >>> with setting(c, 'x', 2): ... c.m() ... 2 >>> print c.x 1 Of course, that just wraps up the same push/pop behavior you're doing into a context manager. > (personally I think .m would better be implemented by passing in a > parameter, but that isn't my choice.) Yep, that's the right answer. You should complain to whoever created this API. STeVe -- http://mail.python.org/mailman/listinfo/python-list