I'm trying to perform some analysis of scope in Python 3 source code and I'm stuck with how the nonlocal statement statement works inside a class definition.
As I understand it, the class definition executes its body inside a new namespace (call it dict) and binds the class name to the result of type(name, bases, dict). Nonlocal x should work as long as it refers to a variable that is bound somewhere in the enclosing non-local scope.
From this I expect the following code to compile and run:
class A:
v = 1
class B:
nonlocal v
v = 2
but this fails with
SyntaxError: no binding for nonlocal 'v' found
while the following code runs perfectly
def A():
v = 1
class B:
nonlocal v
v = 2
Can anyone explain the difference here between the closure of the function definition and the class definition?