MyPy linting 与打字冲突的打字。Self

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

在不可变类的 linting 和重写期间,操作不会通过 mypy 检查器。 该类实现了诸如

__add__
之类的操作,但是,每个返回同一类的新实例的函数都会触发打字错误
Incompatible return value type (got "Point", expected "Self")  [return-value]mypy(error)

我尝试过的方法:

  • T = TypeVar("T", bound="A")
    由于参数 T 绑定到 A,mypy 会将实例化 A() 识别为 T 的子类
  • class A(Generic[T])
    同上
  • return cast(T, A())
    这可行,但需要将强制转换分散在整个代码中。
  • 上面使用 ClassVar 而不是 Generic

有没有一个不严重依赖cast()的解决方案?

最小可重现示例

from typing import Self
class A():
    def meth(self, other:Self) -> Self:
        return A()
python python-3.x mypy python-typing
1个回答
0
投票

解决您问题的最简单方法是:

class A:
    def meth(self, other: "A") -> "A":
        return A()

我相信这里使用

Self
的问题在于,它错误地暗示返回类型基于
self
的类型,但事实并非如此,因为你已经硬编码了
A()

另一个解决方案是:

class A:
    def meth(self, other: Self) -> Self:
        return type(self)()
© www.soinside.com 2019 - 2024. All rights reserved.