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

发布于 2021-01-29 17:59:57

我正在练习在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.Dictdict哪一个,我应该在程序中使用?

关注者
0
被浏览
1140
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用Plaintyping.DictdictNo之间没有真正的区别。

    然而,typing.Dict是一个泛型类型 ,让你指定键和值的类型_太多_ ,使之更加灵活:

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

    因此,很可能是在项目生命周期中的某个时候,您希望更精确地定义字典参数,在这一点上,扩展typing.Dicttyping.Dict[key_type, value_type]而不是替换是“较小”的更改dict

    您可以通过在此处使用MappingMutableMapping类型来使其更通用。由于您的函数不需要
    更改
    映射,因此我坚持使用Mapping。Adict是一个映射,但是您可以创建也满足映射接口的其他对象,并且您的函数可能仍可以与那些对象一起使用:

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

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看