Nick Coghlan added the comment: With the fact that the existence of "Python without closures" predates Python 2.2, this now reads like a straight up compiler bug to me.
Compare the behaviour with no local assignment in the class body: >>> def f(): ... n = 1 ... class C: ... print(n) ... >>> f() 1 To the behaviour once the local is assigned: >>> def f(): ... n = 1 ... class C: ... n = n ... print(n) ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f File "<stdin>", line 4, in C NameError: name 'n' is not defined The issue is that the latter will still emit a LOAD_NAME/STORE_NAME pair, while the former emits LOAD_CLASSDEREF (and has emitted LOAD_DEREF for as long as I can recall hacking on the compiler). Off the top of my head, I'm not sure our current symbol table analysis pass can actually cope with this idea though - it would require separating "just a class body local, which may or may not first be retrieved as a global or builtin" from "a class body local which is first retrieved from a closure reference". ---------- nosy: +ncoghlan _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue19979> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com