小编典典

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

all

我正在练习在 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中使用哪一个?


阅读 212

收藏
2022-07-06

共1个答案

小编典典

typing.Dict使用普通的and没有真正的区别dict

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

Mapping您可以通过在此处使用orMutableMapping类型来使其更加通用;由于您的函数不需要
更改 映射,我会坚持使用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 中的任何对象都是可打印的。


*:注意:如果您使用的是 Python 3.7 或更新版本,dict如果您以 开头的模块,则可以用作泛型类型from __future__ import annotations,并且从 Python 3.9 开始,dict(以及其他标准容器)支持用作泛型类型,即使没有指令

2022-07-06