【问题标题】:How to create a new typing.Dict[str,str] and add items to it如何创建一个新的 typing.Dict[str,str] 并向其中添加项目
【发布时间】:2019-09-09 08:15:38
【问题描述】:

有一个很棒的 Q/A here already 用于在 python 中创建 untyped 字典。我正在努力弄清楚如何创建一个 typed 字典,然后向其中添加内容。

我正在尝试做的一个例子是......

return_value = Dict[str,str]
for item in some_other_list:
  if item.property1 > 9:
    return_value.update(item.name, "d'oh")
return return_value

...但这给我带来了descriptor 'update' requires a 'dict' object but received a 'str'的错误

我已经尝试了上述声明的其他几种排列方式

return_value:Dict[str,str] = None

'NoneType' object has no attribute 'update' 出错。并尝试

return_value:Dict[str,str] = dict() 

return_value:Dict[str,str] = {}

update expected at most 1 arguments, got 2 的两个错误。我不知道这里需要什么来创建一个空类型的字典,就像我在 c# (var d = new Dictionary<string, string>();) 中那样。如果可能的话,我宁愿不回避类型安全。有人可以指出我遗漏了什么或做错了什么吗?

【问题讨论】:

  • return_value 不是dict;它是一个表示dicttype 的对象。您从 typing 导入的内容用于类型提示,而不是实际值。
  • 注意,类型注释不给你类型安全。 Python 中没有“类型化字典”,无论如何都不是内置的。注释用于文档或第三方静态时间类型检查器使用,例如mypy
  • 另外,在dict 中分配一个键值对,你可以使用my_dict[key] = value.update 采用另一个映射,例如另一个字典,并更新您作为参数传递的映射中的键值对。所以你 可以my_dict.update({key:value}) 但这对于单个项目来说是相当浪费的(创建一个完全不必要的中间 dict 对象)。或者,您可以将关键字参数传递给 .update,如下所示:my_dict.update(foo='bar', baz='bing') 从可读性的角度来看,这有时很好

标签: python dictionary strong-typing


【解决方案1】:

最后 2 个是 Dict 的正确用法,但是您在 for 循环中使用不正确的语法更新了字典。

return_value: Dict[str, str] = dict()
for item in some_other_list:
    if item.property1 > 9:
        return_value[item.name] = "d'oh"
return return_value

【讨论】:

  • 谢谢,我在发布大约 15 分钟后发现了这一点。我只花了几个小时就达到了这一点=/。我能找到的Dict[] 的例子有.update(key,value)
【解决方案2】:

Dict 之类的东西不打算在运行时使用;它们是表示用于静态类型分析的类型的对象。如果你想要一个字典,你必须使用

return_value = dict()

您不能使用Dict 创建具有受限运行时类型的对象。

【讨论】:

  • 或更惯用的说法,{} ;)
  • 只是想强调dictDict 是不同的:)
  • 同理,列表是否会更常见地指定为() 而不是list()
  • () 是空元组; [] 是空列表。使用文字更有效,因为不需要名称查找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多