Python类型提示:工厂方法使用什么返回类型?

2024-04-20 16:20:39 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码片段。我想知道这两个工厂类的createclassmethod使用什么返回类型。如果可能的话,我想避免使用Union[Model1, Model2]

T = typing.TypeVar("T", bound="BaseModel")


@dataclass
class BaseModel(object):
    pass


@dataclass
class Model1(BaseModel):
    pass


@dataclass
class Model2(BaseModel):
    pass


class ModelFactory(ABC):
    @classmethod
    @abstractmethod
    def create(cls) -> T:
        pass


class Model1Factory(ModelFactory):
    @classmethod
    def create(cls) -> T:
        return Model1()


class Model2Factory(ModelFactory):
    @classmethod
    def create(cls) -> T:
        return Model2()

m1factory = Model1Factory()
m1 = m1factory.create()

我从mypy获得的错误:

type_hint.child_class_return_self.2.py:32: error: Incompatible return value type (got "Model1", expected "T")
type_hint.child_class_return_self.2.py:37: error: Incompatible return value type (got "Model2", expected "T")
type_hint.child_class_return_self.2.py:41: error: Need type annotation for 'm1'

Tags: childreturndeftypecreatepassclassbasemodel
2条回答

我认为您只需要将Generic合并到等式中,以便mypy可以接受不同的返回类型:

from abc import ABC
from typing import Generic, TypeVar


T = typing.TypeVar("T", bound="BaseModel")


@dataclass
class BaseModel(object):
    pass


@dataclass
class Model1(BaseModel):
    pass


@dataclass
class Model2(BaseModel):
    pass


class ModelFactory(Generic[T], ABC):
    @classmethod
    @abstractmethod
    def create(cls) -> T:
        pass


class Model1Factory(ModelFactory[Model1]):
    @classmethod
    def create(cls) -> Model1:
        return Model1()


class Model2Factory(ModelFactory[Model2]):
    @classmethod
    def create(cls) -> Model2:
        return Model2()


m1factory = Model1Factory()
m1 = m1factory.create()

根据mypy cheat sheet的说法,你应该选择Union[Model1, Model2],但是如果这是你想要避免的事情,下一个最好的候选者是Any类型

相关问题 更多 >