当前位置: 首页 > 面试题库 >

定义type.Dict和dict之间的区别?

周龙光
2023-03-14
问题内容

我正在练习在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.Dictdict哪一个,我应该在程序中使用?


问题答案:

使用Plaintyping.DictdictNo之间没有真正的区别。

然而,typing.Dict是一个泛型类型 ,让你指定键和值的类型_太多_ ,使之更加灵活:

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

因此,很可能是在项目生命周期中的某个时候,您希望更精确地定义字典参数,在这一点上,扩展typing.Dicttyping.Dict[key_type, value_type]而不是替换是“较小”的更改dict

您可以通过在此处使用MappingMutableMapping类型来使其更通用。由于您的函数不需要
更改
映射,因此我坚持使用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中的任何对象都是可打印的。



 类似资料:
  • 本文向大家介绍Java中定义和声明之间的区别。,包括了Java中定义和声明之间的区别。的使用技巧和注意事项,需要的朋友参考一下 对于定义和声明之间的区别,应该首先考虑其字面含义,其中包括声明或声明的“声明”方法,而描述某些实体的“定义”方法。 以下是定义和声明之间的重要区别。 序号 键 声明 定义 1 概念 声明的概念包括通知编译器有关变量的属性,例如变量的名称,其持有的值的类型以及初始值(如果有

  • 问题内容: 我注意到使用PyCharm可以转换 字典文字 : 到 dict构造函数中 : 这些不同的方法是否在某些重要方面有所不同? (在写这个问题时,我注意到使用数字键..似乎是不可能的,但是,显然不可能。 问题答案: 我认为您已经指出了最明显的区别。除此之外, 第一个不需要查找,这应该使其快一点 第二查找中,然后和出土文物内置的,所以你可以通过定义一个本地被叫交换机的行为,例如,虽然我想不出任

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。