如何声明包含 类 的字典类型

How declare type of dict containing classes

我试图用 typing 模块声明以下函数参数的类型:

import typing


class A(object):
    pass

class B(A):
    pass

class C(B):
    pass

def my_func(p: typing.Dict[A, str]) -> None:
    pass

my_func({C: 'foo'})
my_func

p 参数必须是 dictA 的子类作为键,str 作为值。实际符号失败 mypy 检查:

example.py:17: error: List item 0 has incompatible type "Tuple[C, str]"

如何通过键入声明 p 的类型?

代码使用 class C 本身作为键,而不是 C.

的实例
my_func({C: 'foo'})

传递 C class 的实例应该没问题。

my_func({C(): 'foo'})
         ^^^--- instance, not a class itself

如果你真的需要传递class本身(我对此表示怀疑),你需要使用typing.Type:

typing.Dict[typing.Type[A], str]
            ^^^^^^^^^^^^^^