如何将 mypy 与派生 类 和方法调用一起使用?

How to use mypy with derived classes and method calls?

我正在为 mypy 苦苦挣扎,不明白我想传递派生的 class,其中代码接受基础 class 或任何派生的实例 class,并调用该传递实例的方法。

我的代码:

from typing import Type
import abc

class Base(abc.ABC):
    @abc.abstractmethod
    def my_method(self):
        pass

class Derived(Base):
    def my_method(self):
        print("Derived")

def my_function(b: Type[Base]):
    b.my_method()  # line 14

d = Derived()
my_function(d)  # line 17

当我 运行 这样做时,它会打印“Derived”(正如预期的那样)。但是mypy对此并不满意:

mcve.py:14: error: Too few arguments for "my_method" of "Base"

mcve.py:17: error: Argument 1 to "my_function" has incompatible type "Derived"; expected "Type[Base]"

我假设第14行的错误是因为mypy没有看到第一个参数在方法调用的前面(base.),这可能是因为第17行的错误?

如何让 mypy 理解这段代码?或者我在这里缺少什么?

如果您想将 BaseBase 的子 class 作为参数传递,则使用

Type。您打算传递此类 class.

实例
def my_function(b: Base):
    b.my_method()

第 14 行的错误是按字面意思理解您的类型提示,并认为您的意思是 Base.my_method(x) 而不是 x.my_method()

您可以简单地使用 Base 作为 b 的类型:

def my_function(b: Base):
    b.my_method()

mypy会接受它。