【问题标题】:Subclass in type hinting类型提示中的子类
【发布时间】:2018-02-15 22:35:38
【问题描述】:

我想允许使用 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) 应该可以工作?

【问题讨论】:

  • Python 是否也会引发此错误?否则,它可能是 PyCharm 中的一个错误!
  • 对我来说,我在 python 控制台上尝试过,它工作正常。可能是 PyCharm 中的错误..
  • 是的,它正在工作,据我所知,类型提示是可选的。我仍然希望该方法的用户明确知道哪些类打算在那里使用。

标签: python subclass type-hinting python-typing


【解决方案1】:

当您指定cls: A 时,您是在说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

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

【讨论】:

  • 如果我没看错的话,def myfunc(cls: A): ...; myfunc(B()) 没问题,(我们要处理实例),B() 是 [a 的子类] A 的实例,而不是 [or 的子类] A. OR def myfunc(cls: Type[A]): ...; myfunc(B) 可以,(我们要处理类)B 是类(或子类)A,而不是 A 的实例[或子类实例]。
  • 如果期望 A 的任何子类的实例会是什么样子?
  • 引用的链接建议定义一个TypeVar,有必要吗?
猜你喜欢
  • 2021-08-29
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2020-03-18
相关资源
最近更新 更多