Я сделал опечатку в своем коде, которая синтаксически полностью замолчала.
dict_args : {"arg1":1,"arg2":2,"arg3":3}
# .... Some more code
some_function(**dict_args)
# .... Some more code
Если вы не заметили, это использование : вместо = при объявлении переменной dict_args.
Итак, мой вопрос: имеет ли синтаксис Python: a:1, сам по себе какое-либо значение? Или это гипотетически следует считать синтаксической ошибкой?
Если вы сомневаетесь, вы можете сделать import dis; dis.dis('a : 1'), чтобы получить представление о том, что происходит. Как уже упоминалось, код устанавливает аннотацию для левой стороны.
Чтобы продолжить комментарий @PatrickHaugh, взгляните на документация с подсказкой типа
Тем не менее, это является немного странно, что вы можете сделать, например. a : 1, даже если a не существует, и все равно не будет существовать после запуска этой строки.
Это переменная аннотация, один использовать из которых является подсказкой типа.
@jdehesa Я не уверен в причине, по которой это было изначально разрешено, но, возможно, это было связано с ожиданием его использования в определении dataclass.
@chepner Может быть, хотя странно, что тебе могут сойти с рук всякие странные вещи вроде {}[0, ['1'], 2:3] : 4
@chepner Я думаю, что в этом случае 2:3 это фрагмент, а не аннотация.
@PatrickHaugh D'о, конечно.






ПЭП-526 представил аннотации переменных, которые предоставляют программистам возможность добавлять информацию о типе к переменным. Это позволяет, среди прочего, такие утверждения, как
x: int
чтобы указать, что существует локальная переменная типа int, без ее инициализации. В PEP-484 — Подсказки допустимого типа мы видим, что аннотации «должны быть допустимыми выражениями, которые оцениваются без возникновения исключений», что и является литералом вашего словаря.
Если вы посмотрите на Сама грамматика Python, вы увидите, что правила expr_stmt и annassign делают пример, который вы показываете, законным.
Если вы используете IDE или другие инструменты подсказки типов, они определенно должны жаловаться на это, но это не нарушает правил, установленных Python.
Хотя я понимаю ваш ответ, на самом деле я не согласен с тем, что он должен быть приемлемым. Зачем комментировать то, чего еще нет? он должен быть, по крайней мере, ограничен рамками параметров или назначением переменных. Например: x: int = 1 будет иметь смысл. Аннотирование перед определением значения похоже на то, как я пытаюсь сказать вам, без какого-либо контекста, что Victor works as a vendor.. Да, хорошо, но кто такой Виктор и какое мне дело?
Я склонен с вами согласиться, хотя именно такой синтаксис делает возможным использование классов данных в их нынешнем виде. Обоснование Guiod здесь заключается в том, что это упрощает случаи, когда присваивание может происходить в нескольких местах, но я не уверен, что это оправдывает его подверженность ошибкам.
@Aetos Поскольку типы имеют только значения, а не имена, подумайте о a: int как о намеке на то, что когда значение присваивается a, оно должно быть int. Нет причин, по которым int должен быть назначен немедленно, чтобы подсказка была действительной.
@chepner что я нахожу странным, так это то, что аннотация настолько разрешающая, почему бы не обеспечить, чтобы аннотация была типа str, int и т. д., есть ли очевидные варианты использования, которые я упускаю?
Такие аннотации изначально не предназначались и по-прежнему не предназначены для ограничения подсказок типа. Первоначально аннотации функций были оставлены открытыми, чтобы люди могли найти для них применение. Например, вы можете просто указать короткую строку документа, описывающую назначение переменной. Я полагаю, что в Python 4 аннотации больше не будут даже оцениваться как выражения, а будут храниться как буквальные строки в соответствующем атрибуте __annotations__.
(См. python.org/dev/peps/pep-0563 относительно отложенной оценки аннотаций. Я заметил, однако, что он не рекомендует использование аннотаций без указания типа. В будущем возможно, что такое использование может быть официально запрещено, хотя, поскольку синтаксический анализатор просто в этом time будет эффективно обрабатывать аннотацию как строковый литерал, кажется, нет особых причин для этого.)
Это интерпретируется как подсказка типа.