Словари обычно используются в качестве наборов ключей, наиболее важной операцией является поиск значения, связанного с произвольным ключом . Обычно в словаре каждый ключ имеет одинаковый тип, а каждое значение имеет одинаковый тип; если значения неоднородны, то выражение ranges[key]
не обязательно будет иметь определенный тип (хотя вы можете представить его как объединение).
В вашем коде анализатор stati c пытается определить тип вашего словаря. Тип, который он ожидает, имеет форму Dict[K, V]
, где K
и V
еще предстоит определить. Первое назначение ranges['max'] = 0
дает информацию об обоих неизвестных: K
кажется str
и V
кажется int
. Таким образом, на этом этапе ranges
выводится как тип Dict[str, int]
.
Следующие две строки дают ошибки, потому что пустой список не может использоваться как значение в Dict[str, int]
, а значения из Dict[str, int]
нет метода append
.
Явная аннотация типа ranges: dict = dict()
отменяет поведение по умолчанию, указывая, что это разнородный словарь, так что значения не все имеют иметь тот же тип. Учитывая эту информацию, анализатор stati c не предполагает, что, поскольку одним из значений является int
, все они должны быть int
s.