我正在练习在 Python 3.5 中使用类型提示。我的一位同事使用typing.Dict:
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
我应该在typing.Dict程序dict中使用哪一个?
dict
typing.Dict使用普通的and没有真正的区别dict。
但是,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。
typing.Dict[key_type, value_type]
Mapping您可以通过在此处使用orMutableMapping类型来使其更加通用;由于您的函数不需要 更改 映射,我会坚持使用Mapping. Adict是一种映射,但您可以创建其他也满足映射接口的对象,并且您的函数可能仍然可以与这些对象一起使用:
Mapping
MutableMapping
def change_bandwidths(new_bandwidths: typing.Mapping[str, str], user_id: int, user_name: str) -> bool:
现在你清楚地告诉这个函数的其他用户你的代码实际上不会 改变 传入的new_bandwidths映射。
new_bandwidths
您的实际实现只是期望一个可打印的对象。这可能是一个测试实现,但就目前而言,如果您使用 ,您的代码将继续工作new_bandwidths: typing.Any,因为 Python 中的任何对象都是可打印的。
new_bandwidths: typing.Any
*:注意:如果您使用的是 Python 3.7 或更新版本,dict如果您以 开头的模块,则可以用作泛型类型from __future__ import annotations,并且从 Python 3.9 开始,dict(以及其他标准容器)支持用作泛型类型,即使没有指令。
from __future__ import annotations