使 python 键入下标泛型(实例)可检查



我希望能够重用typing更多,即用于类型检查,最好是以与检查某些东西是否属于

...(我的(理想是能够做这样的事情:

from typing import Union, Iterable, Any, Mapping
KeysType = checkable(Union[Iterable[str], Mapping[str, Any]])
assert isinstance(['foo', 'bar'], KeysType)
assert not isinstance([3, 'foo', 'bar'], KeysType)
assert isinstance({'foo': 1, 'bar': 2}, KeysType)
assert isinstance({0: 0, 'foo': 1, 'bar': 2}, KeysType)
assert not isinstance(5, KeysType)

当然,有些事情有点不对劲,因为我用isinstance来表示has_interface_ofhas_compatible_stucture.当愿望困扰着我时,我告诉自己:

from collections.abc import Mapping
isinstance(dict(), Mapping)

然而,dict不是Mapping的实例。

尽管如此,即使是自定义is_sorta_like_this_type函数而不是isinstance函数也可以,如果挂钩到isinstance的行为太可怕的畸变。

在stackoverflow上也提出了类似的问题,但是没有一个提议的答案对我来说是令人满意的 - 尽管这个虽然很笨拙,但却是我得到的最接近的答案。

typing模块有几个有用的功能。您可以使用get_args访问下标泛型(如UnionOptional(的内容。这也适用于下标类型别名,如ListMapping等。

最新更新