Mypy:有什么方法可以实现“ SelfType” TypeVar?

时间:2019-02-05 11:00:16

标签: python python-3.x types mypy

所以这是一个相当小的问题,但是我想知道是否有人更熟悉键入模块,是否知道有办法做到这一点。

我希望能够定义一个类型变量,该类型变量始终等同于其内部使用的类的实例(如果由子类使用,则等同于该子类类型的实例)。

为了确保mypy理解返回值等于调用它的类,我目前正在做的事情是注释'self'和'cls'参数,如下所示:

from typing import TypeVar, Type

T = TypeVar("T")


class Parent:
    @classmethod
    def from_classmethod(cls: Type[T]) -> T:
        return cls()

    def from_method(self: T) -> T:
        return type(self)()


class Child(Parent):
    pass


Child.from_classmethod()  # mypy: Revealed type is Child
Child().from_method()  # mypy: Revealed type is Child

它确实起作用,mypy会将它们正确地解释为“孩子”类,而不是“父”类。

但是,如果不需要,我不想这样做。我想知道是否有某种方式可以创建像这样的TypeVar:

SelfType = ...  # some voodoo magic goes here


class Parent:
    @classmethod
    def from_classmethod(cls) -> SelfType:
        return cls()

    def from_method(self) -> SelfType:
        return type(self)()


class Child(Parent):
    pass


# OtherParent is reusing SelfType without having to redefine it
class OtherParent:
    @classmethod
    def from_classmethod(cls) -> SelfType:
        return cls()

    def from_method(self) -> SelfType:
        return type(self)()


class OtherChild(OtherParent):
    pass


Child.from_classmethod()  # mypy: Revealed type is Child
Parent.from_classmethod()  # mypy: Revealed type is Parent
OtherChild.from_classmethod()  # mypy: Revealed type is OtherChild
OtherParent.from_classmethod()  # mypy: Revealed type is OtherParent

主要要点是,我只需要定义一次TypeVar,然后便可以将其应用于我想要的任何类,并让mypy根据上下文推断出该类型与从其调用的类相同(即使方法被继承)。

这到底是可以做到的吗,还是需要mypy项目中的功能请求?

1 个答案:

答案 0 :(得分:2)

您必须定义一个typevar。有关主题,请参见this discussion

  T = TypeVar('T', bound='Copyable')
  class Copyable:
      def copy(self: T) -> T:
          # return a copy of self