¿Qué está haciendo este extraño comportamiento del colon?

Estoy usando Python 3.6.1, y he encontrado algo muy extraño. Tenía un simple error tipográfico en el diccionario que me llevó mucho tiempo encontrarlo.

context = {} context["a"]: 2 print(context) 

Salida

 {} 

¿Qué está haciendo el context["a"]: 2 código context["a"]: 2 ? No levanta un SyntaxError cuando debería IMO. Al principio pensé que estaba creando una rebanada. Sin embargo, al escribir repr(context["a"]: 2) genera un SyntaxError . También escribí el context["a"]: 2 en la consola y la consola no imprimió nada. Pensé que tal vez devolvió None , pero no estoy tan seguro.

También pensé que podría ser una sola línea si la statement, pero esa no debería ser la syntax correcta tampoco.

Además, el context["a"] debería generar un KeyError .

Estoy perplejo. Que esta pasando?

Usted ha escrito accidentalmente una anotación variable sintácticamente correcta. Esa característica se introdujo en Python 3.6 (ver PEP 526 ).

Aunque una anotación variable se analiza como parte de una asignación anotada , la instrucción de asignación es opcional :

 annotated_assignment_stmt ::= augtarget ":" expression ["=" expression] 

Así, en context["a"]: 2

  • context["a"] es el objective de anotación
  • 2 es la propia anotación
  • context["a"] se deja sin inicializar

El PEP indica que “el objective de la anotación puede ser cualquier objective de asignación única válido, al menos sintácticamente (depende del verificador de tipo qué hacer con esto)” , lo que significa que la clave no necesita existir para ser anotado (por lo tanto no KeyError ). Aquí hay un ejemplo del PEP original:

 d = {} d['a']: int = 0 # Annotates d['a'] with int. d['b']: int # Annotates d['b'] with int. 

Normalmente, la expresión de anotación debe evaluar un tipo de Python; después de todo, el uso principal de las anotaciones es una sugerencia de tipo, pero no se aplica. La anotación puede ser cualquier expresión de Python válida , independientemente del tipo o valor del resultado.

Como puede ver, en este momento, las sugerencias de tipo son muy permisivas y rara vez son útiles, a menos que tenga un verificador de tipo estático como mypy .