【发布时间】:2022-01-24 02:14:03
【问题描述】:
以下代码在使用mypy --strict 运行时会产生错误
from typing import Protocol
class Proto(Protocol):
id: int
name: str
def work(self, hours: float) -> str: ...
class RoleA:
def work(self, hours: float) -> str:
return f"A {hours}"
class RoleB:
def work(self, hours: float) -> str:
return f"B {hours}"
class X:
def __init__(self, id: int, name: str) -> None:
self.id = id
self.name = name
class Y(X, RoleA):
def __init__(self, id: int, name: str) -> None:
super().__init__(id, name)
class Z(X, RoleB):
def __init__(self, id: int, name: str) -> None:
super().__init__(id, name)
def track(items: list[Proto], hours: float) -> None:
for item in items:
result = item.work(hours)
if __name__ == "__main__":
y = Y(id = 4, name = "Jane Doe")
z = Z(id = 3, name = "Kevin Bacon")
items = [y, z]
track(items, 40)
错误如下:
program.py:38:错误:“track”的参数 1 具有不兼容的类型“List[X]”;预期“列表[原型]”
我不明白为什么会发生这种情况,据我所知Y 和Z 都实现了Proto 协议,那么为什么mypy 不能推断出它们是有效的参数track 函数?
【问题讨论】: