定义typing.Dict和dict之间的区别?

时间:2016-05-07 10:36:38

标签: python dictionary type-hinting

我正在练习在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 module documentation

typing.Dictdict之间我应该在程序中使用哪一个?

3 个答案:

答案 0 :(得分:55)

使用普通typing.Dictdict之间没有区别,没有。

但是,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

您可以在此处使用MappingMutableMapping类型,使其更加通用;因为你的函数不需要改变映射,所以我坚持使用Mappingdict是一个映射,但您可以创建其他也满足映射接口的对象,并且您的函数可能仍然适用于这些:

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

现在您明确告诉其他用户此功能,您的代码实际上不会更改传入的new_bandwidths映射。

您的实际实现只是期望一个可打印的对象。这可能是一个测试实现,但是如果你使用new_bandwidths: typing.Any,你的代码会继续工作,因为Python中的任何对象都是可打印的。

答案 1 :(得分:11)

typing.Dictdict的通用版本:

  

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]

答案 2 :(得分:0)

python org所述:

<块引用>

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

<块引用>

dict 的通用版本。用于注释返回类型。到 注释参数最好使用抽象集合类型 例如映射。

这种类型可以如下使用:

def count_words(text: str) -> Dict[str, int]:
    ...

但是 dict 不太通用,您将能够更改传入的映射。 事实上,您在 python.Dict 中指定了更多详细信息。

另一个提示:

<块引用>

自 3.9 版起已弃用:builtins.dict 现在支持 []。见 PEP 585 和通用别名类型。