定义type.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.Dict
或dict
哪一个,我应该在程序中使用?
-
使用Plain
typing.Dict
和dict
No之间没有真正的区别。然而,
typing.Dict
是一个泛型类型 ,让你指定键和值的类型_太多_ ,使之更加灵活:def change_bandwidths(new_bandwidths: typing.Dict[str, str], user_id: int, user_name: str) -> bool:
因此,很可能是在项目生命周期中的某个时候,您希望更精确地定义字典参数,在这一点上,扩展
typing.Dict
到typing.Dict[key_type, value_type]
而不是替换是“较小”的更改dict
。您可以通过在此处使用
Mapping
或MutableMapping
类型来使其更通用。由于您的函数不需要
更改
映射,因此我坚持使用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中的任何对象都是可打印的。