我正在练习使用Python 3.5中的类型提示。我的一个同事使用打字。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()

它们都工作得很好,似乎没有什么不同。

我已经阅读了打字模块文档。

在打字。Dict或Dict我应该在程序中使用哪个?


使用普通类型与使用普通类型之间没有真正的区别。言归正传,没有。

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

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

因此,在项目生命周期中的某个时刻,您很可能希望更精确地定义dictionary参数,此时扩展类型。注意打字。Dict[key_type, value_type]是一个比替换Dict“更小”的变化。

你可以在这里使用Mapping或MutableMapping类型使其更通用;因为你的函数不需要改变映射,我坚持使用映射。dict是一个映射,但是你可以创建其他对象来满足映射接口,你的函数仍然可以使用这些对象:

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

现在,您清楚地告诉这个函数的其他用户,您的代码实际上不会改变传入的new_bandwidth映射。

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


*:注意:如果你使用的是Python 3.7或更新版本,你可以使用dict作为泛型类型,如果你从__future__导入注释开始你的模块,并且从Python 3.9开始,即使没有这个指令,dict(以及其他标准容器)也支持被用作泛型类型。


打字。Dict是Dict的通用版本:

类类型。Dict(Dict, MutableMapping[KT, VT]) dict的通用版本。该类型的用法如下: get_position_in_index(word_list: Dict[str, int], word: str) -> int: 返回word_list[词]

在这里,你可以在dict中指定键和值的类型:


正如在python org中所说:

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

dict的通用版本。用于注释返回类型。来 注释参数时,首选使用抽象集合类型 比如映射。

该类型的使用方法如下:

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

但是dict不太通用,您可以更改传入的映射。 事实上,在python中。请你再详细说明一下。

另一个提示:

3.9版后已移除:内置。Dict现在支持[]。参见PEP 585 和通用别名类型。


如果你从谷歌来 TypeError: typing参数太少。实际1,预期2,您需要为键和值提供类型。

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