Что это за странное поведение двоеточия 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 .

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

Вы случайно написали синтаксически правильную переменную-аннотацию . Эта функция была введена в Python 3.6 (см. PEP 526 ).

Хотя переменная аннотация обрабатывается как часть аннотированного присваивания , оператор присваивания является необязательным :

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

Таким образом, в context["a"]: 2

  • context["a"] – цель annotations
  • 2 – сама аннотация
  • context["a"] остается неинициализированным

ППС заявляет, что «целью annotations может быть любая действительная цель одиночного назначения, по крайней мере синтаксически (это зависит от типа проверки, что с этим делать)» , что означает, что ключ не должен существовать, чтобы быть аннотированный (отсюда и KeyError ). Вот пример из исходного PEP:

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

Обычно выражение annotations должно оцениваться по типу Python – ведь основное использование аннотаций является намеком типа, но оно не применяется. Аннотирование может быть любым допустимым выражением Python, независимо от типа или значения результата.

Как вы можете видеть, в настоящее время типы подсказок очень разрешительны и редко полезны, если у вас нет статического типа, например, mypy .

  • ImportError на python 3, отлично работал на python 2.7
  • Импорт pandas показывает ImportError: невозможно импортировать имя hashtable
  • TypeError: не может использовать строковый шаблон для байтового объекта в re.findall ()
  • Поскольку matplotlib.finance устарел, как я могу использовать новый модуль mpl_finance?
  • Требуется Microsoft Visual C ++ 14.0 (невозможно найти vcvarsall.bat)
  • Удалить и заменить Печатные элементы
  • TypeError: необходим байтовый объект, а не 'str' в python и CSV
  • Как объединить gridspec с plt.subplots (), чтобы устранить пробел между строками подзаголовков
  • Python 3.4 на Sublime Text 3
  • Python 3 возвращает «недопустимый синтаксис» при попытке выполнить интерполяцию строк
  • Быстрое удаление пунктуации с помощью панд
  • Interesting Posts

    Как получить доступ к разделу восстановления Windows 8 и как восстановить его на заводской образ?

    Можно ли использовать запрос Algolia в FirestoreRecyclerOptions?

    DD-WRT: не удается увидеть клиента при использовании проводной сети

    Советы по использованию Vim как Java IDE?

    Изменение имени виртуального рабочего стола в Windows 10

    Список всех файлов, соответствующих шаблону полного пути в R

    Выполнение Trie

    Хороший метод GetHashCode () для объектов списка Foo, соответствующих порядку

    Защищенный конструктор и доступность

    Как я могу всегда запускать командную строку как администратор?

    gcc / g ++ для размещения всех объектных файлов в отдельном каталоге

    Lambda выражение для преобразования массива / Список строк в массив / Список целых чисел

    Как добавить настраиваемый HTTP-заголовок для каждого вызова WCF?

    Отключить Spring Security для OPTIONS Http Method

    Перспектива отправки вложений как winmail.dat

    Давайте будем гением компьютера.