Разве аннотирование несуществующего поля dict не должно вызывать ошибку? - PullRequest
2 голосов
/ 07 ноября 2019

Может ли кто-нибудь объяснить, почему нет ошибки при аннотировании несуществующего поля dict?

dict_1 = {}
dict_1['a']: 'aa' #used colon by mistake instead of assign, code passes without any error on python3.7.2


print(__annotations__) # prints empty dict {}
dict_1['a'] # as expected KeyError: 'a'

Редактировать: После тестирования большего количества случаев я обнаружил, что аннотирование существующего поля dict также молча не дает результата.

dict_2 = {'a': 'b'}
dict_2['a']: 'c' # no error here so I would expect to get new annotation
print(__annotations__) # produces empty dict {}

1 Ответ

2 голосов
/ 07 ноября 2019

Вы можете комментировать любую действительную цель назначения. Ссылка Выражения аннотирования из PEP 536:

Целью аннотации может быть любая допустимая единичная цель назначения, по крайней мере, синтаксически (это зависит от средства проверки типов, что делать сthis):

class Cls:
    pass

c = Cls()
c.x: int = 0  # Annotates c.x with int.
c.y: int      # Annotates c.y with int.

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

Обратите внимание, что даже имя в скобках считается выражением, а не простым именем:

(x): int      # Annotates x with int, (x) treated as expression by compiler.
(y): int = 0  # Same situation here.

Документация для аннотированных операторов присваивания , будет означать, что эти значения не сохраняются. Предположительно это оставлено на усмотрение инструмента статической проверки типов.

Для выражений в качестве целей назначения аннотации оцениваются, если они находятся в области видимости класса или модуля, но не сохраняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...