On Sun, Apr 29, 2018 at 9:28 PM, Tim Peters
Ooops. My proof [of] anti-concept has a flaw. It only "shadows" names
[David Mertz
] 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.