我正在练习使用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(以及其他标准容器)也支持被用作泛型类型。
正如在python org中所说:
类类型。Dict(Dict, MutableMapping[KT, VT])
dict的通用版本。用于注释返回类型。来
注释参数时,首选使用抽象集合类型
比如映射。
该类型的使用方法如下:
def count_words(text: str) -> Dict[str, int]:
...
但是dict不太通用,您可以更改传入的映射。
事实上,在python中。请你再详细说明一下。
另一个提示:
3.9版后已移除:内置。Dict现在支持[]。参见PEP 585
和通用别名类型。