136

我想允许使用 Python 3 进行类型提示以接受某个类的子类。例如:

class A:
    pass

class B(A):
    pass

class C(A):
    pass

def process_any_subclass_type_of_A(cls: A):
    if cls == B:
        # do something
    elif cls == C:
        # do something else

现在输入以下代码时:

process_any_subclass_type_of_A(B)

我得到一个 PyCharm IDE 提示“预期类型 A,改为类型 [B]。”

如何在此处更改类型提示以接受 A 的任何子类型?

根据PEP 484(“类型是特定参数类型的子类型的表达式也可以用于该参数。”),我知道我的解决方案(cls: A)应该有效吗?

4

1 回答 1

216

当您指定 时cls: A,您是说cls需要一个type的实例A。指定cls为类型A(或其子类型)的类对象的类型提示使用typing.Type.

from typing import Type
def process_any_subclass_type_of_A(cls: Type[A]):
    pass

类对象的类型

有时您想谈论从给定类继承的类对象。这可以拼写为Type[C]where Cis a class。换句话说,whenC是类的名称,使用C注释参数声明参数是C(或子类C)的实例,但使用Type[C]作为参数注释声明参数是派生自C(或C本身)。

于 2017-09-07T09:09:28.327 回答