提示类型

时间:2017-09-07 08:59:10

标签: python subclass type-hinting

我想允许使用Python 3进行类型提示来接受某个类的子类。 E.g:

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?

的任何子类型

根据这个(https://www.python.org/dev/peps/pep-0484/#type-definition-syntax,"类型是特定参数类型的子类型的表达式也被该参数接受。"),我理解我的解决方案{{1}应该工作吗?

3 个答案:

答案 0 :(得分:20)

执行cls: A时,您说cls将转到A类型的实例。要使其适用于类型或其子类型,请使用typing.Type

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

来自The type of class objects

  

有时你想谈论从a继承的类对象   给定的课程。这可以拼写为Type[C],其中C是一个类。在   换句话说,当C是类的名称时,使用C来注释   参数声明该参数是C(或一个   C)的子类,但使用Type[C]作为参数注释声明   该参数是一个派生自C(或C本身)的类对象。

答案 1 :(得分:6)

我找到了解决方案。使用:

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

如上面的PEP中所述,所期望的行为将会存在。

答案 2 :(得分:0)

仅作为提示,在python 3.8中,子类现在已接受这种类型的提示方式。

(也许也由于Pycharm的最新版本)