我正在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
之间,我应该在程序中使用哪一个?
使用普通typing.Dict
和dict
之间没有真正的区别
然而,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
"更小"。
您可以在此处使用Mapping
或MutableMapping
类型,使其更加通用;由于您的函数不需要更改映射,因此我将使用Mapping
。dict
是一个映射,但您可以创建其他也满足映射接口的对象,并且您的函数可能仍然可以使用这些对象:
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.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]
如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]