Estoy usando Python 3.6.1 y me he encontrado con algo muy extraño. Tenía un simple error tipográfico en una tarea de diccionario que me tomó mucho tiempo encontrar.
context = {}
context["a"]: 2
print(context)
Salida
{}
¿Qué está context["a"]: 2
haciendo el código ? No plantea un SyntaxError
cuándo debería en mi opinión. Al principio pensé que estaba creando un corte. Sin embargo, al escribir se repr(context["a"]: 2)
genera un SyntaxError
. También escribí context["a"]: 2
en la consola y la consola no imprimió nada. Pensé que tal vez regresó None
, pero no estoy tan seguro.
También pensé que podría ser una declaración if de una sola línea, pero esa tampoco debería ser la sintaxis correcta.
Además, context["a"]
debería plantear un KeyError
.
Estoy perplejo. Que esta pasando?
python
python-3.x
justengel
fuente
fuente
Respuestas:
Ha escrito accidentalmente una anotación de variable sintácticamente correcta . Esa característica se introdujo en Python 3.6 (consulte PEP 526 ).
Aunque una anotación de variable se analiza como parte de una asignación anotada , la declaración de asignación es opcional :
Así, en
context["a"]: 2
context["a"]
es el objetivo de la anotación2
es la anotación en sícontext["a"]
se deja sin inicializarEl PEP establece que "el destino de la anotación puede ser cualquier destino de asignación único 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:Normalmente, la expresión de anotación debería evaluarse a un tipo de Python; después de todo, el uso principal de las anotaciones es la 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 útiles, a menos que tenga un verificador de tipo estático como mypy .
fuente
=
Entonces, ¿no debería requerir un operador de asignación? La clave no existe. Esto me parece mal.:
es el operador de asignación. Solo estamos "asignando" una anotación de tipo solo, no una clave. Dudo que haya alguna razón para permitirlo, solo un efecto secundario involuntario de agregar la sintaxis de anotación.x: str
e inmediatamente seguida detype(x)
, el intérprete generará unNameError
. En mi opinión, la sintaxis debe hacer cumplir el objeto está predefinido o se define en el acto. Esto solo introduce confusión.x = 'i am a string'
antes dex: str
hace que el último tipo de redundante .. Esto no debería haber sido añadido en absoluto. Estuvo bien como comentario; Nunca muestro que se usa de una forma u otra.