我想允许使用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}应该工作吗?
答案 0 :(得分:20)
执行cls: A
时,您说cls
将转到A
类型的实例。要使其适用于类型或其子类型,请使用typing.Type
。
from typing import Type
def process_any_subclass_type_of_A(cls: Type[A]):
pass
有时你想谈论从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的最新版本)