如何在 Python 字典中使用任何类型作为键来键入 annotate?

问题描述 投票:0回答:1

在Python中,类型是第一类对象。 因此,我可以创建一个以类型为键的字典。 例如:

mydict = {
    int: "Hello!",
    str: 12,
    SomeClassName: "Hello again!"}

假设我的字典将填充任意类型作为键,我如何键入注释?

我已经尝试过:

mydict: dict[type, Any] = {
    int: "Hello!",
    str: 12,
    SomeClassName: "Hello again!"}

和:

mydict: dict[Type[Any], Any] = {
    int: "Hello!",
    str: 12,
    SomeClassName: "Hello again!"}

甚至:

mydict: dict[Any, Any] = {
    int: "Hello!",
    str: 12,
    SomeClassName: "Hello again!"}

但是

mypy
抱怨所有这些的分配。对以任何类型作为键的字典进行类型注释的正确方法是什么?

如果我只有某些类型,例如

int
str
,我可能可以将其注释为
dict[Union[Type[int], Type[str]]], Any]
,但由于我想支持 any 类型的键,所以这并不能解决问题。

如果没有类型注释,语法就可以正常工作,我什至可以从字典中检索特定值。例如:

mydict = {
    int: "Hello!",
    str: 12,
    SomeClassName: "Hello again!"}

print(mydict[int])

...成功打印出来了

Hello!

如果重要的话,我正在使用 Python 3.9.6 和 mypy 0.812。

python dictionary python-typing mypy
1个回答
2
投票

@Heike 非常好地给了我我的答案作为评论。 (谢谢!)

要对使用类型作为键的字典进行类型注释,请使用 Dict...而不是 dict:

mydict: Dict[type, Any]

...效果很好。 这是我犯的一个愚蠢的错误,源于我最初尝试输入注释 OrderedDict。 以相同的方式键入注释 OrderedDict:

mydict: OrderedDict[type, Any] = {int: "Something"}

...不起作用。 然而,在过去的 24 小时里,我已经阅读了足够多的有关 dict 的内容,同时试图发现我的错误,我还发现我曾尝试将 dict 分配给 OrderedDict,但这也不起作用。

谢谢 Heike 指出我明显的错误。

© www.soinside.com 2019 - 2024. All rights reserved.