On Sun, Apr 29, 2018 at 9:28 PM, Tim Peters <tim.peters@gmail.com> wrote:
[David Mertz <mertz@gnosis.cx>]
> Ooops. My proof [of] anti-concept has a flaw.  It only "shadows" names that
> already exist.  Presumably that's the wrong idea, but it's easy enough to
> change if desired.
 
        with sublocal(a=6):
            g("first in block")
            a = 5
            g("set a to 5")
            b = 19
            g("set b to 19")
        g("after")

Worm around that too, then going back to the example at the top, if
the manager's

        locals().update(_locals)

had the intended effect, it would end up restoring `b` to 2 too, yes?
The only names that "should be" restored are the names in the `kws`
dict.

Actually, that wasn't my intention.  As I imagined the semantics, I wanted a context manager that restored the "outside" context for anything defined "inside" the context.  Allowing keyword arguments was just an extra "convenience" that was meant to be equivalent to defining/overwriting variables inside the body.  So these would be equivalent:

## 1
with sublocal():
    a = 1
    b = 2
    x = a + b
# a, b now have their old values again

## 2
with sublocal(a=1, b=2):
    x = a + b
# a, b now have their old values again

## 3
with sublocal(a=1):
    b = 2
    x = a + b
# a, b now have their old values again

I knew I was ignoring nonlocals and nested function scopes.  But just trying something really simple that looks like the un-proposal in some cases.  Maybe there's no way in pure-Python to deal with the edge cases though.