Разве «a: 1» не должно быть синтаксической ошибкой в ​​python?

Я сделал опечатку в своем коде, которая синтаксически полностью замолчала.

dict_args : {"arg1":1,"arg2":2,"arg3":3}
# .... Some more code
some_function(**dict_args)
# .... Some more code

Если вы не заметили, это использование : вместо = при объявлении переменной dict_args.

Итак, мой вопрос: имеет ли синтаксис Python: a:1, сам по себе какое-либо значение? Или это гипотетически следует считать синтаксической ошибкой?

Это интерпретируется как подсказка типа.

Patrick Haugh 06.03.2019 15:55

Если вы сомневаетесь, вы можете сделать import dis; dis.dis('a : 1'), чтобы получить представление о том, что происходит. Как уже упоминалось, код устанавливает аннотацию для левой стороны.

jdehesa 06.03.2019 15:57

Чтобы продолжить комментарий @PatrickHaugh, взгляните на документация с подсказкой типа

r.ook 06.03.2019 16:04

Тем не менее, это является немного странно, что вы можете сделать, например. a : 1, даже если a не существует, и все равно не будет существовать после запуска этой строки.

jdehesa 06.03.2019 16:05

Это переменная аннотация, один использовать из которых является подсказкой типа.

chepner 06.03.2019 16:13

@jdehesa Я не уверен в причине, по которой это было изначально разрешено, но, возможно, это было связано с ожиданием его использования в определении dataclass.

chepner 06.03.2019 16:14

@chepner Может быть, хотя странно, что тебе могут сойти с рук всякие странные вещи вроде {}[0, ['1'], 2:3] : 4

jdehesa 06.03.2019 16:28

@chepner Я думаю, что в этом случае 2:3 это фрагмент, а не аннотация.

Patrick Haugh 06.03.2019 17:21

@PatrickHaugh D'о, конечно.

chepner 06.03.2019 17:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
9
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ПЭП-526 представил аннотации переменных, которые предоставляют программистам возможность добавлять информацию о типе к переменным. Это позволяет, среди прочего, такие утверждения, как

x: int

чтобы указать, что существует локальная переменная типа int, без ее инициализации. В PEP-484 — Подсказки допустимого типа мы видим, что аннотации «должны быть допустимыми выражениями, которые оцениваются без возникновения исключений», что и является литералом вашего словаря.

Если вы посмотрите на Сама грамматика Python, вы увидите, что правила expr_stmt и annassign делают пример, который вы показываете, законным.

Если вы используете IDE или другие инструменты подсказки типов, они определенно должны жаловаться на это, но это не нарушает правил, установленных Python.

Хотя я понимаю ваш ответ, на самом деле я не согласен с тем, что он должен быть приемлемым. Зачем комментировать то, чего еще нет? он должен быть, по крайней мере, ограничен рамками параметров или назначением переменных. Например: x: int = 1 будет иметь смысл. Аннотирование перед определением значения похоже на то, как я пытаюсь сказать вам, без какого-либо контекста, что Victor works as a vendor.. Да, хорошо, но кто такой Виктор и какое мне дело?

Imad 06.03.2019 16:28

Я склонен с вами согласиться, хотя именно такой синтаксис делает возможным использование классов данных в их нынешнем виде. Обоснование Guiod здесь заключается в том, что это упрощает случаи, когда присваивание может происходить в нескольких местах, но я не уверен, что это оправдывает его подверженность ошибкам.

Patrick Haugh 06.03.2019 16:51

@Aetos Поскольку типы имеют только значения, а не имена, подумайте о a: int как о намеке на то, что когда значение присваивается a, оно должно быть int. Нет причин, по которым int должен быть назначен немедленно, чтобы подсказка была действительной.

chepner 06.03.2019 17:24

@chepner что я нахожу странным, так это то, что аннотация настолько разрешающая, почему бы не обеспечить, чтобы аннотация была типа str, int и т. д., есть ли очевидные варианты использования, которые я упускаю?

Chris_Rands 06.03.2019 19:56

Такие аннотации изначально не предназначались и по-прежнему не предназначены для ограничения подсказок типа. Первоначально аннотации функций были оставлены открытыми, чтобы люди могли найти для них применение. Например, вы можете просто указать короткую строку документа, описывающую назначение переменной. Я полагаю, что в Python 4 аннотации больше не будут даже оцениваться как выражения, а будут храниться как буквальные строки в соответствующем атрибуте __annotations__.

chepner 06.03.2019 20:00

(См. python.org/dev/peps/pep-0563 относительно отложенной оценки аннотаций. Я заметил, однако, что он не рекомендует использование аннотаций без указания типа. В будущем возможно, что такое использование может быть официально запрещено, хотя, поскольку синтаксический анализатор просто в этом time будет эффективно обрабатывать аннотацию как строковый литерал, кажется, нет особых причин для этого.)

chepner 06.03.2019 20:05

Другие вопросы по теме