为什么 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,但在上面的代码中没有发现任何错误。似乎是应该推断的东西。


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

解决方法

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

如果你注释:

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

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