定义类型之间的区别.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.Dictdict之间,我应该在程序中使用哪一个?

使用普通typing.Dictdict之间没有真正的区别

然而,typing.Dict是一个泛型类型*,它允许您指定键和值的类型,使其更加灵活:

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

因此,在项目生命周期的某个时刻,您很可能希望更精确地定义dictionary参数,此时将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中的任何对象都是可打印的。


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

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]

中指定键和值的类型

如python org.中所述

类类型。Dict(Dict,MutableMapping[KT,VT])

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

这种类型可以按如下方式使用:

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

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

另一个提示:

自3.9版以来已弃用:builtins.dict现在支持[]。参见PEP 585和Generic Alias Type。

如果你来自谷歌TypeError: Too few parameters for typing.Dict; actual 1, expected 2,您需要为键和值提供一个类型。

因此,Dict[str, str]而不是Dict[str]

最新更新