Evan Driscoll schrieb:
(If you don't want to read the following, note that you can answer my question by writing a swap function.)I want to make a context manager that will temporarily change the value of a variable within the scope of a 'with' that uses it. This is inspired by a C++ RAII object I've used in a few projects. Ideally, what I want is something like the following: x = 5 print x # prints 5 with changed_value(x, 10): print x # prints 10 print x # prints 5 This is similar to PEP 343's example 5 ("Redirect stdout temporarily"; see http://www.python.org/dev/peps/pep-0343/), except that the variable that I want to temporarily change isn't hard-coded in the stdout_redirected function. What I want to write is something like this: @contextmanager def changed_value(variable, temp_value): old_value = variable variable = temp_value try: yield None finally: variable = old_value with maybe a check in 'finally' to make sure that the value hasn't changed during the execution of the 'with'. Of course this doesn't work since it only changes the binding of 'variable', not whatever was passed in, and I kind of doubt I can stick a "&" and "*" in a couple places to make it do what I want. :-) So my question is: is what I want possible to do in Python? How?
No. And unfortunately, the with-statement (as the for-statement and others) leaks it's name, so you can't even use it like this:
with changed_value(variable, temp_value) as new_name: ... The new_name will be defined afterwards. Diez -- http://mail.python.org/mailman/listinfo/python-list
