使用mypy时Python中的继承和多态性不起作用

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

我希望用 mypy 做一些标准的多态性,我以前从未使用过它,而且到目前为止还不够直观。

基础级

class ContentPullOptions:
    pass


class Tool(Protocol):
    async def pull_content(self, opts: ContentPullOptions) -> str | Dict[str, Any]: ...

子类

class GoogleSearchOptions(ContentPullOptions):
    query: str
    sites: List[str]


class GoogleSearchTool(Tool):
    async def pull_content(
        self,
        opts: GoogleSearchOptions,
    ) -> str | Dict[str, Any]:

失败:

error: Argument 1 of "pull_content" is incompatible with supertype "Tool"; supertype defines the argument type as "ContentPullOptions" 

像这样在 mypy 中通过类型检查进行基本继承的最可维护和最简洁的方法是什么?

我尝试了自定义类型、铸造等。但一切都感觉有点混乱和不清楚。

python python-3.x mypy
1个回答
0
投票

重写方法的类型,为了符合里氏替换原则,必须是继承方法的子类型。因为函数的参数类型是逆变的,这意味着重写方法的参数类型必须是继承方法的“超类型”。也就是说,GoogleSearchTool.pull_content必须接受一个

至少
ContentPullOptions一样普遍的论点,而不是
具体的东西。

© www.soinside.com 2019 - 2024. All rights reserved.