Razón para un comportamiento UnboundLocalError no intuitivo

Nota: hay una pregunta muy similaraquí. Tengan paciencia, sin embargo; mi pregunta no es "¿Por qué ocurre el error?", sino "¿Por qué se implementó Python para generar un error en este caso?"

Me tropecé con esto:

a = 5
def x()
    print a
    a = 6
x()

arroja unUnboundLocalException. Ahora, sí sé por qué sucede eso (más adelante en este ámbito,a esta atado, entoncesa Se considera local en todo el ámbito de aplicación).

En este caso:

a = 5
def x()
    print b
    b = 6
x()

Esto tiene mucho sentido. Pero el primer caso tiene una lógica intuitiva, que significa esto:

a = 5
def x()
    print globals()["a"]
    a = 6 # local assignment
x()

Supongo que hay una razón por la cual la versión "intutiva" no está permitida, pero ¿cuál es? Aunque este podría ser un caso de "Explicito es mejor que implícito", jugueteando con elglobals() Siempre me siento un poco sucio.

Para poner esto en perspectiva, el caso real en el que esto me sucedió fue el guión de otra persona que tuve que cambiar por un momento. En mi cambio (de corta duración), hice un cambio de nombre de archivo mientras se ejecutaba el script, así que inserté

import os
os.rename("foo", "bar")

en el guión. Esta inserción ha ocurrido dentro de una función. El módulo ya importado.os en el nivel superior (no lo comprobé), y algunosos.somefunction Llamadas donde se realizan dentro de la función, pero antes de mi inserción. Estas llamadas obviamente desencadenaron unaUnboundLocalException.

Entonces, ¿alguien puede explicarme el razonamiento detrás de esta implementación? ¿Es para evitar que el usuario cometa errores? ¿La forma "intuitiva" solo complicaría las cosas para el compilador de bytecode? ¿O hay una posible ambigüedad en la que no pensé?

Respuestas a la pregunta(3)

Su respuesta a la pregunta