微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在派生类和方法调用中使用mypy?

如何解决如何在派生类和方法调用中使用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

运行此命令时,它会打印“ Derived”(按预期)。但是mypy对此不满意:

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

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

我认为第14行错误是因为mypy看不到第一个参数在方法调用base.)的前面,这可能是由于第17行的错误? >

如何让mypy理解此代码?还是我在这里想念什么?

解决方法

如果要传递TypeBase的子类作为参数,请使用

Base。您打算传递此类的 instance

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将接受它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。