我正在尝试使用__new__对我的班级进行一些自定义,但我遇到了一些mypy错误。以下代码是简化版本。
from abc import ABC, abstractproperty
class A(ABC):
def __new__(cls, x: int) -> 'A':
return super().__new__(cls)
@abstractproperty
def log(self) -> None:
pass
class B(A):
def __new__(cls, x: str) -> 'B':
return super().__new__(cls, int(x))
def log(self) -> None:
print('Hello World')
mypy错误如下:
test.py:5:错误:参数1到" __ new __" "对象"具有不兼容的类型"类型[A]&#34 ;;预期"输入[对象]"
test.py:13:错误:不兼容的返回值类型(得到" A",预期" B")
test.py:13:错误:参数1到" __ new __" " A"具有不兼容的类型"类型[B]&#34 ;;预期"输入[A]"
答案 0 :(得分:0)
我最近有同样的问题。我认为mypy还不支持__new__()
的特殊行为。
我的解决方法是两次使用typing.cast()
,如下所示:
def __new__(cls, x: str) -> "B":
return typing.cast(
"B",
super().__new__(
typing.cast(typing.Type[A], cls),
int(x),
),
)