Estoy tratando de realizar algún análisis de alcance en el código fuente de Python 3 y estoy atascado con cómo funciona la instrucción de declaración no local dentro de una definición de clase.instrucción no local de Python en una definición de clase
Según tengo entendido, la definición de clase ejecuta su cuerpo dentro de un nuevo espacio de nombres (llámelo dict) y vincula el nombre de clase al resultado del tipo (nombre, bases, dict). La x no local debe funcionar siempre que se refiera a una variable enlazada en algún lugar dentro del alcance no local adjunto.
De esta espero que el siguiente código para compilar y ejecutar:
class A:
v = 1
class B:
nonlocal v
v = 2
pero esta falla con
SyntaxError: no binding for nonlocal 'v' found
mientras que el siguiente código funciona perfectamente
def A():
v = 1
class B:
nonlocal v
v = 2
¿Puede alguien explicar la diferencia aquí entre el cierre de la definición de la función y la definición de la clase?
Más investigación: en la última muestra de código, locals() en A es {v: 1}, mientras que dentro B es {v: 2, ''__module__'': '' __main__'', ''__locals__'': {...}} – Andyrooger