首页 > 解决方案 > 为什么 MyPy 拒绝发现这有什么问题?

问题描述

这是 MyPy 的一个限制:它不能推断出应该通过的类型super().x吗?

class A:
    def x(self, r: int) -> None:
        pass


class C(A):
    def x(self, *args) -> None:
        super().x(*args)


def _() -> None:
    c = C()
    c.x('')

c.x('')尽管传递了一个A.x采用 int的字符串,但在上面的代码中没有发现错误。这似乎是应该推断的。


有没有办法让它识别打字错误?

标签: pythonmypy

解决方案


你没有注释*args,所以它是隐含的Any。此代码中涉及的所有调用都是静态有效的。

如果你注释它:

def x(self, *args: int) -> None:

然后 mypy 报告类型错误。(尽管如此,它仍然不会报告错误c.x(1, 2)。这将需要对*调用进行令人不安的严格规则,或者需要比 mypy 执行更多的数据流分析。)


推荐阅读