如何创建一个新的 typing.Dict[str, str] 并向其中添加元素

3

已经有一个很好的问题和答案,介绍了如何在Python中创建一个无类型字典。我正在尝试弄清楚如何创建一个有类型字典并向其中添加内容。

我想做的一个示例是...

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

...但是这会让我得到一个错误:描述符'update'需要一个'dict'对象,但收到了一个'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>();)。如果可能的话,我不想牺牲类型安全。有人可以指出我缺失或错误的地方吗?


4
return_value不是一个dict,它是代表dict类型的对象。从typing导入的东西仅用于类型提示,而不是实际值。 - chepner
3
注意,类型注解并不能给你类型安全性。在Python中没有“类型字典”("typed dict"),至少不是内置的。类型注解只是用于文档说明或由第三方静态类型检查器(例如mypy)使用。 - juanpa.arrivillaga
此外,要在dict中分配单个键值对,您可以使用my_dict[key] = value.update接受另一个映射,例如另一个字典,并更新传递给它的映射中的键值对。因此,您可以执行my_dict.update({key:value}),但对于单个项目而言这是相当浪费的(创建完全不必要的中间字典对象)。或者,您可以通过关键字参数传递给.update,像这样:my_dict.update(foo='bar', baz='bing'),有时从可读性的角度来看这很好。 - juanpa.arrivillaga
2个回答

8
最后两个是正确使用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

1
谢谢,发帖后大约15分钟我就弄明白了。但是我花了几个小时才达到那个程度 =/。我能找到的 Dict[] 的例子都是用 .update(key,value) 的形式。 - StingyJack

3

Dict 这样的对象并不是用于运行时操作的,它们代表用于静态类型分析的类型。如果你想要一个字典,你需要使用 dict

return_value = dict()

您不能使用 Dict 创建一个受限制的运行时类型的对象。


或更具习惯表达,{};) - juanpa.arrivillaga
只是想强调一下,dictDict是不同的 :) - chepner
同样的道理,列表是否更常被指定为 () 而不是 list() - StingyJack
1
() 是空元组;[] 是空列表。使用字面量更高效,因为不需要名称查找。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接