使用__new__时Mypy会抛出错误

时间:2018-04-12 11:52:37

标签: python mypy

我正在尝试使用__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]"

1 个答案:

答案 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),
        ),
    )