当变量类型是预期类型的子集时,Mypy 会抱怨类型不兼容

问题描述 投票:0回答:1

尝试构建一个

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 类型提示,我不明白什么?

python mypy python-typing
1个回答
1
投票

使用来自Selcuk的信息,我发现了这个有点冗长的解决方案,如mypy文档中详述:由于

Mapping
的键是不变的,需要明确暗示
str
有类型
Hashable
。 (虽然字符串是
Hashable
的子类型,但
Mapping
的键不是协变的,因此不允许子类型。)。或者,正如Selcuk他的评论中所说:

str
is
Hashable
,但由于
dict
是可变数据类型,因此您必须为键传递完全相同的类型,而不是子类型。被调用的函数可能会向传递的参数添加另一个
Hashable
键,从而破坏源代码。

coordinates: Dict[Hashable, Tuple[str, Any]] = {
    "time": ("time", time_coordinates)
}
attributes: Dict[Hashable, Any] = {"some_flag": False}
© www.soinside.com 2019 - 2024. All rights reserved.