On Wed, 1 Jan 2020 at 10:42, Yonatan Zunger <zun...@humu.com> wrote: > > Thanks for writing this up, Nick! > > My main question is about the remaining difference between semantics at the > class/module versus function level: is it worth the additional cognitive > complexity to have the class/module behavior be different from the function > behavior?
Mutating values through locals() has long worked at class and module scope, and folks rely on that often enough that we don't want to break their code. Correctly supporting mutation via locals() also falls naturally out of the runtime semantics of those scopes (at module scope, locals() returns the same namespace as globals() does, while at class scope it returns the same namespace as will eventually be passed to the metaclass to create the new class object). By contrast, mutation via locals() at function scope hasn't worked consistently since fast locals were introduced, and that predates even statically nested scopes (I went trawling through the repo history to try to work out when they were first added, and made it as far as "some time before 1997, since [1] changed how they worked to make them faster, but was replacing an even older list-based mechanism"). Cheers, Nick. [1] https://github.com/python/cpython/commit/f3e85a0356e679ed9ff8d13236ff8e9f77a9fd0b#diff-f1de0b7194da5b0cdf48379eca8678d7 -- Nick Coghlan | ncogh...@gmail.com | Brisbane, Australia _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/VATKCBOQKJWFL7TQ5I7NTUHW5OMEYHTY/ Code of Conduct: http://python.org/psf/codeofconduct/