
On Mon, 5 Dec 2022 at 06:04, David Mertz, Ph.D. <david.mertz@gmail.com> wrote:
Like most commenters, I think the whole "create an anonymous function then call it" scoping thing is too complex and has too many edge cases to be a good idea.
That said, I decided to play around with what I can do to serve the general purpose within existing Python:
@contextmanager ... def local(pats=["scoped_*"]): ... try: ... yield ... finally: ... for _var in list(globals()): ... for pat in pats: ... if fnmatch(_var, pat): ... exec(f"del {_var}", globals()) ... with local(['a', 'b', 'c']): ... a, b = 5, 6 ... c = a + b ... d = c**2 ... print(d) ... 121 a Traceback (most recent call last): Cell In [37], line 1 a NameError: name 'a' is not defined
d 121
You're not the first to try to use globals() for this, but it means that the context manager works ONLY at top-level. You can't do this with it: def foo(): with local("abc"): a, b = 5, 6 c = a + b d = c ** 2 print(d) print(a) and expect it to work. (Side point, though: if you're deleting a name from globals(), why not just delete it straight out of the dictionary rather than exec'ing?) ChrisA