我希望能够重用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_of
或has_compatible_stucture
.当愿望困扰着我时,我告诉自己:
from collections.abc import Mapping
isinstance(dict(), Mapping)
然而,dict
不是Mapping
的实例。
尽管如此,即使是自定义is_sorta_like_this_type
函数而不是isinstance
函数也可以,如果挂钩到isinstance
的行为太可怕的畸变。
在stackoverflow上也提出了类似的问题,但是没有一个提议的答案对我来说是令人满意的 - 尽管这个虽然很笨拙,但却是我得到的最接近的答案。
typing
模块有几个有用的功能。您可以使用get_args
访问下标泛型(如Union
或Optional
(的内容。这也适用于下标类型别名,如List
、Mapping
等。