Ответ 1
Вы случайно написали синтаксически правильную переменную-аннотацию. Эта функция была введена в Python 3.6 (см. PEP 526).
Хотя переменная аннотация обрабатывается как часть аннотированного присваивания, оператор присваивания является необязательным:
annotated_assignment_stmt ::= augtarget ":" expression ["=" expression]
Таким образом, в context["a"]: 2
-
context["a"]
- цель аннотации -
2
- сама аннотация -
context["a"]
остается неинициализированным
ППС заявляет, что "целью аннотации может быть любая действительная цель одиночного назначения, по крайней мере синтаксически (это зависит от типа проверки, что с этим делать)", что означает, что ключ не должен существовать, чтобы быть аннотированный (отсюда и KeyError
). Вот пример из исходного PEP:
d = {}
d['a']: int = 0 # Annotates d['a'] with int.
d['b']: int # Annotates d['b'] with int.
Обычно выражение аннотации должно оцениваться по типу Python - ведь основное использование аннотаций является намеком типа, но оно не применяется. Аннотирование может быть любым допустимым выражением Python, независимо от типа или значения результата.
Как вы можете видеть, в настоящее время типы подсказок очень разрешительны и редко полезны, если у вас нет статического типа, например, mypy.