181

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

4

3 回答 3

240

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(以及其他标准容器)支持用作泛型类型,即使没有指令

于 2016-05-07T10:45:42.147 回答
36

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]

于 2016-05-07T10:46:43.343 回答
5

正如python org中所说:

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

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

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

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

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

另一个提示:

3.9 版后已弃用:builtins.dict 现在支持 []。请参阅PEP 585 和通用别名类型。

于 2021-04-21T06:36:27.327 回答