python - 如何将 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 理解这段代码?或者我在这里错过了什么?
解决方案
Type
如果您想传递Base
或Base
作为参数的子类,则使用。您打算传递此类的一个实例。
def my_function(b: Base):
b.my_method()
第 14 行的错误是从字面上理解你的类型提示,并认为你的意思是做类似Base.my_method(x)
而不是x.my_method()
.
推荐阅读
- php - 找不到错误对象在此服务器上找不到请求的 URL
- android - 通过在 recycleradapter 中实现接口,使用 kotlin 通过 recycler 适配器将哈希映射写入 firebase
- xcode - Xcode 核心数据编辑器在 Xcode 12 中停止工作
- django - 如何在 Django / Graphene 测试中模拟 info.context
- typescript - 使用并发承诺填充记录
- ios - 在 iOS / Swift 中添加到现有的 UINavigationController
- swiftui - SwiftUI:有条件的 onDelete
- python - 变量以字符串形式出现;TypeError:abs()的错误操作数类型:'str'
- python - 使用列表更新嵌套字典时的奇怪行为
- scala - Scala 3 中还存在 volatile 类型吗?