Разница между определением typing.Dict и dict?

Я занимаюсь использованием подсказок типа в Python 3.5. Один из моих коллег использует typing.Dict:

import typing


def change_bandwidths(new_bandwidths: typing.Dict,
                      user_id: int,
                      user_name: str) -> bool:
    print(new_bandwidths, user_id, user_name)
    return False


def my_change_bandwidths(new_bandwidths: dict,
                         user_id: int,
                         user_name: str) ->bool:
    print(new_bandwidths, user_id, user_name)
    return True


def main():
    my_id, my_name = 23, "Tiras"
    simple_dict = {"Hello": "Moon"}
    change_bandwidths(simple_dict, my_id, my_name)
    new_dict = {"new": "energy source"}
    my_change_bandwidths(new_dict, my_id, my_name)

if __name__ == "__main__":
    main()

Оба они работают отлично, не существует различий.

Я прочитал документацию модуля typing.

Между typing.Dict или dict, который я должен использовать в программе?

Ответы

Ответ 1

Нет никакой реальной разницы между использованием простых typing.Dict и dict, no.

Однако typing.Dict является Generic type, который позволяет также указать тип ключей и значений, делая его более гибким:

def change_bandwidths(new_bandwidths: typing.Dict[str, str],
                      user_id: int,
                      user_name: str) -> bool:

Таким образом, вполне возможно, что в какой-то момент вашего жизненного цикла проекта вы хотите более точно определить аргумент словаря, в результате чего расширение typing.Dict до typing.Dict[key_type, value_type] является "меньшим" изменением, чем замена dict.

Вы можете сделать это еще более общим с помощью Mapping или MutableMapping здесь; так как вашей функции не нужно изменять отображение, я бы придерживался Mapping. A dict - это одно отображение, но вы можете создавать другие объекты, которые также удовлетворяют интерфейсу отображения, и ваша функция может все еще работать с ними:

def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
                      user_id: int,
                      user_name: str) -> bool:

Теперь вы ясно говорите другим пользователям этой функции, что ваш код фактически не изменит отображаемое сопоставление new_bandwidths.

Ваша фактическая реализация - это просто ожидание объекта, который можно распечатать. Это может быть тестовая реализация, но, поскольку она стоит, ваш код будет продолжать работать, если вы использовали new_bandwidths: typing.Any, потому что любой объект в Python можно печатать.

Ответ 2

typing.Dict является общей версией dict:

class typing.Dict(dict, MutableMapping[KT, VT])

Общая версия dict. Использование этого типа выглядит следующим образом:

def get_position_in_index(word_list: Dict[str, int], word: str) -> int:
     return word_list[word]

Здесь вы можете указать тип ключа и значения в dict: Dict[str, int]