微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“Animal”的“foo”没有重载变体匹配参数类型“str”

如何解决“Animal”的“foo”没有重载变体匹配参数类型“str”

我有一个文件 t.py,它有一个Animal一个子类 Cat。两者都有方法 foo,它根据布尔值 inplace 的值具有不同的返回类型。

这是文件的完整代码

# t.py

from __future__ import annotations

from typing import TypeVar,Optional,overload,Literal 

CatOrDog = TypeVar("CatOrDog",bound="Animal")


class Animal:
    @overload
    def foo(self: CatOrDog,inplace: Literal[False],bar) -> CatOrDog:
        ...

    @overload
    def foo(self: CatOrDog,inplace: Literal[True],bar) -> None:
        ...

    def foo(
        self: CatOrDog,inplace: bool = False,bar=None
    ) -> Optional[CatOrDog]:
        ...

    def ffill(self) -> Optional[CatOrDog]:
        return self.foo(bar="a")


class Cat(Animal):
    @overload
    def foo(self,bar) -> Cat:
        ...

    @overload
    def foo(self,bar) -> None:
        ...

    def foo(self,bar=None) -> Optional[Cat]:
        ...

如果我在它上面运行 mypy,我得到

$ mypy t.py 
t.py:23: error: No overload variant of "foo" of "Animal" matches argument type "str"
t.py:23: note: Possible overload variants:
t.py:23: note:     def foo(self,bar: Any) -> Animal
t.py:23: note:     def foo(self,bar: Any) -> None
Found 1 error in 1 file (checked 1 source file)

如何正确重载 foo,以便我可以调用 self.foo(bar="a")?我试过设置 bar: Any,但不起作用。

解决方法

您需要允许重载之一的默认参数,并在 self 方法中为 ffill 设置正确的类型。

作为:

from __future__ import annotations

from typing import TypeVar,Optional,overload,Literal 

CatOrDog = TypeVar("CatOrDog",bound="Animal")


class Animal:
    @overload
    def foo(self: CatOrDog,inplace: Literal[False]=...,bar=...) -> CatOrDog:
        ...

    @overload
    def foo(self: CatOrDog,inplace: Literal[True],bar=...) -> None:
        ...

    def foo(
        self: CatOrDog,inplace: bool = False,bar=None
    ) -> Optional[CatOrDog]:
        ...

    def ffill(self: CatOrDog) -> Optional[CatOrDog]:
        
        return self.foo(bar="a")


class Cat(Animal):
    @overload
    def foo(self,bar=...) -> Cat:
        ...

    @overload
    def foo(self,bar=...) -> None:
        ...

    def foo(self,bar=None) -> Optional[Cat]:
        ...

https://mypy-play.net/?mypy=latest&python=3.9&gist=49da369f6343543769eed2060fa61639

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。