定义typing.Dict和Dict的区别?

2024-04-24 22:54:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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()

他们两个都工作得很好,似乎没有什么区别。

我读过^{} module documentation

typing.Dictdict之间,我应该在程序中使用哪一个?


Tags: nameidtypingnewmainmydefchange
1条回答
网友
1楼 · 发布于 2024-04-24 22:54:38

使用普通的typing.Dictdict没有实际的区别,不

但是,typing.Dict是一个Generic type,它允许您指定键的类型和值,使其更灵活:

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。一个dict是一个映射,但是您可以创建其他同样满足映射接口的对象,并且您的函数可能仍然可以使用这些对象:

def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
                      user_id: int,
                      user_name: str) -> bool:

现在您清楚地告诉这个函数的其他用户,您的代码实际上不会改变传入的new_bandwidths映射。

实际的实现只需要一个可打印的对象。这可能是一个测试实现,但是如果您使用new_bandwidths: typing.Any,您的代码将继续工作,因为Python中的任何对象都是可打印的。

相关问题 更多 >