首页 > 解决方案 > 如何将 mypy 与派生类和方法调用一起使用?

问题描述

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

我的代码:

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

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

mcve.py:14:错误:“Base”的“my_method”参数太少

mcve.py:17:错误:“my_function”的参数 1 具有不兼容的类型“Derived”;预期“类型[基础]”

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

如何让 mypy 理解这段代码?或者我在这里错过了什么?

标签: pythonmypy

解决方案


Type如果您想传递BaseBase作为参数的子类,则使用。您打算传递此类的一个实例。

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

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


推荐阅读