Подтвердить что ты не робот

Что это за странное поведение двоеточия Python?

Я использую Python 3.6.1, и я столкнулся с чем-то очень странным. У меня была простая оговорка о назначении слова, которая заставила меня долго находить.

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

Вывод

{}

Что такое context["a"]: 2 кода context["a"]: 2? Он не поднимает SyntaxError когда он должен ИМО. Сначала я подумал, что это создает кусочек. Тем не менее, ввод текста repr(context["a"]: 2) вызывает SyntaxError. Я также набрал context["a"]: 2 в консоли и консоль ничего не печатала. Я подумал, что, возможно, он вернулся None, но я не уверен.

Я также думал, что это может быть оператор с одной строкой, но это тоже не должно быть правильным синтаксисом.

Кроме того, context["a"] должен поднять KeyError.

Я недоумеваю. Что происходит?

4b9b3361

Ответ 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.