所以这是一个相当小的问题,但是我想知道是否有人更熟悉键入模块,是否知道有办法做到这一点。
我希望能够定义一个类型变量,该类型变量始终等同于其内部使用的类的实例(如果由子类使用,则等同于该子类类型的实例)。
为了确保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项目中的功能请求?
答案 0 :(得分:2)
您必须定义一个typevar。有关主题,请参见this discussion。
T = TypeVar('T', bound='Copyable')
class Copyable:
def copy(self: T) -> T:
# return a copy of self