我正在练习在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
module documentation。
在typing.Dict
或dict
之间我应该在程序中使用哪一个?
答案 0 :(得分:55)
使用普通typing.Dict
和dict
之间没有区别,没有。
但是,typing.Dict
是一个Generic type,可让您指定键的类型和值 ,使其更灵活:
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
。 dict
是一个映射,但您可以创建其他也满足映射接口的对象,并且您的函数可能仍然适用于这些:
def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
user_id: int,
user_name: str) -> bool:
现在您明确告诉其他用户此功能,您的代码实际上不会更改传入的new_bandwidths
映射。
您的实际实现只是期望一个可打印的对象。这可能是一个测试实现,但是如果你使用new_bandwidths: typing.Any
,你的代码会继续工作,因为Python中的任何对象都是可打印的。
答案 1 :(得分:11)
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]
答案 2 :(得分:0)
如python org所述:
<块引用>class typing.Dict(dict, MutableMapping[KT, VT])
<块引用>dict 的通用版本。用于注释返回类型。到 注释参数最好使用抽象集合类型 例如映射。
这种类型可以如下使用:
def count_words(text: str) -> Dict[str, int]:
...
但是 dict
不太通用,您将能够更改传入的映射。
事实上,您在 python.Dict
中指定了更多详细信息。
另一个提示:
<块引用>自 3.9 版起已弃用:builtins.dict 现在支持 []。见 PEP 585 和通用别名类型。