我正在尝试使用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'})


pmy_func参数必须是dict,且A的子类为键,而str为值。实际记法通过mypy检查失败:


  example.py:17:错误:列表项0的类型“ Tuple [C,str]”不兼容


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

最佳答案

该代码使用类C本身作为键,而不是C的实例。

my_func({C: 'foo'})


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

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




如果确实需要传递类本身(我对此表示怀疑),则需要使用typing.Type

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

09-26 16:12