【发布时间】:2017-11-01 10:14:45
【问题描述】:
我有几个namedtuples 共享一些字段。我有一个接受这些元组的函数,并保证只与共享字段交互。我想在 mypy 中对此类代码进行类型检查。
代码示例如下:
from typing import NamedTuple
class Base(NamedTuple):
x: int
y: int
class BaseExtended(NamedTuple):
x: int
y: int
z: str
def DoSomething(tuple: Base):
return tuple.x + tuple.y
base = Base(3, 4)
base_extended = BaseExtended(5, 6, 'foo')
DoSomething(base)
DoSomething(base_extended)
当我在这段代码上运行 mypy 时,我得到一个可预测的错误:
mypy_example.py:20:错误:“DoSomething”的参数 1 具有不兼容的类型“BaseExtended”;预期的“基地”
有没有办法构造我的代码并保持 mypy 类型检查?我不能从Base 继承BaseExtended,因为there's a bug 在NamedTuple 继承实现中。
我也不想使用丑陋的Union[Base, BaseExtended],因为当我尝试对List 进行类型检查时,这会中断,因为List[Union[Base, BaseExtended]] 不等于List[BaseExtended],因为some mypy magic about variant/covariant types。
我应该放弃这个想法吗?
【问题讨论】:
标签: python type-hinting mypy python-typing namedtuple