覆盖类型提示时何时使用具有多个 TypeVar 的泛型

问题描述 投票:0回答:0

我在代码中经常遇到这样的情况,我想定义重写其基类的方法的子类,同时返回基类抽象方法的原始类型提示的特定子类型。

看来我有两个选择,那就是

  • 使用带有绑定 TypeVar 的 Generic 并在子类中指定返回子类型,并覆盖子类中的类型提示(示例中的
    Foo
  • 覆盖子类中的类型提示并且不使用泛型(示例中的
    Bar

当具有多个继承级别且许多类型提示被子类中的子类型覆盖时,泛型类的 TypeVar 列表可能会变得相当长。在这种情况下我应该使用泛型,还是只覆盖类型提示?

示例:

class BaseA:
    pass

AType = TypeVar('AType', bound=BaseA)

class BaseB1(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def method1(self: Self) -> BaseA:
        pass

class BaseB2(Generic[AType], metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def method1(self: Self) -> AType:
        pass

class ASub(BaseA):
    pass

class Foo(BaseB1):
    def method1(self: Self) -> ASub:
        return ASub()
    
class Bar(BaseB2[ASub]):
    def method1(self: Self) -> ASub:
        return ASub()

在我看来,泛型有用的地方是当使用

BaseB2[something]
时,而不是
Bar
。但这仍然没有回答我的问题...

mypy看来,在执行重写时,如果不使用Generic,那么在缩小方法参数类型或扩大方法返回类型时会产生错误。然而,正如我之前所说,对于我正在编写的类,TypeVar 列表变得相当长(6 个以上带有详细名称的 TypeVar),而且我不知道如何以简洁的方式编写它。

python oop mypy python-typing
© www.soinside.com 2019 - 2024. All rights reserved.