如何解决当变量类型是预期类型的子集时,Mypy 抱怨类型不兼容
尝试构建一个 xarray
Dataset
,我们在将输入传递给构造函数之前构建参数“coords”和“attrs”的输入:
coordinates = {"time": ("time",time_coordinates)}
attributes = {"some_flag": False}
...
ds = xr.Dataset(data_vars=variables,coords=coordinates,attrs=attributes)
令我困惑的是 mypy
针对此代码运行的输出:
error: Argument "coords" to "Dataset" has incompatible type "Dict[str,Tuple[str,Any]]"; expected "Optional[Mapping[Hashable,Any]]"
error: Argument "attrs" to "Dataset" has incompatible type "Dict[str,bool]"; expected "Optional[Mapping[Hashable,Any]]"
dict
不是 Mapping
吗?难道str
不也是Hashable
吗?在任何情况下,Tuple
和 bool
都不是 Any
类型吗?我对这里的 mypy 和/或 Python 类型提示有什么不明白的地方?
解决方法
使用来自 Selcuk 的信息,我找到了这个有点冗长的解决方案,如 mypy docs 中所述:由于 Mapping
的键是不变的,因此需要明确提示str
是 Hashable
类型。 (虽然字符串是 Hashable
的子类型,但 Mapping
的键不是协变的,不允许子类型。)。或者,正如 Selcuk 在 his comment 中所说:
str
is 是 Hashable
,但由于 dict
是可变数据类型,因此您必须为键传递完全相同的类型,而不是子类型.被调用函数可能会向传递的参数添加另一个 Hashable
键,从而破坏源代码。
coordinates: Dict[Hashable,Tuple[str,Any]] = {
"time": ("time",time_coordinates)
}
attributes: Dict[Hashable,Any] = {"some_flag": False}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。