如何使用任何类型作为 Python 字典中的键来键入注释?

How do I type annotate using any type as a key in a Python dictionary?

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

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],但因为我想支持任何类型的键,所以这不会削减它。

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

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

print(mydict[int])

...它成功打印出 Hello!

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

@Heike 非常好,可以给我我的回答作为评论。 (谢谢!)

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

mydict: Dict[type, Any]

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

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

...不起作用。但是,在过去的 24 小时内,我已经阅读了足够多的有关听写的文章,同时试图发现我的错误,我还发现我曾试图将听写分配给 OrderedDict,但它也不起作用。

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