我正在寻找一个可以判断类型注释是否是另一个类型注释的子集的函数。
它可能位于标准库或第三方库中。由于 mypy 和 pytype 等类型检查器已经解决了这个问题,我假设有一些函数可以做到这一点,但找不到它。
例如函数
f
使得:
from typing import *
f(Sequence, List) # True
f(Sequence[str], List) # False
f(Iterable[str], List[str]) # True
f(List[str], Iterable[str]) # False
f(str, str) # True
f(int, str) # False
issubclass
适用于实际类型和简单类型注释,
issubclass(str, str) # True
issubclass(int, str) # False
issubclass(list, Sequence) # True
issubclass(Iterable, Sequence) # False
issubclass(Sequence, Iterable) # True
但不适用于仿制药:
issubclass(List[str], Iterable[str])
TypeError:下标泛型不能与类和实例检查一起使用
高级目标是能够在给定两个函数的情况下确定它们是否可以组合。
最终自己针对常见用例实现了这一点(
Optional
、Union
、Callable
、Tuple
和简单类型都可以)。
pip install gamla
那么用法是:
import gamla
def test_is_subtype():
for x, y in [
[FrozenSet[str], FrozenSet[str]],
[str, Any],
[Tuple[str, ...], Tuple[str, ...]],
[Set[str], Collection[str]],
[List, Sequence],
[Union[int, str], Union[int, str]],
[str, Union[int, str]],
[Union[List, Set], Collection],
]:
assert gamla.is_subtype(x, y)
def test_not_is_subtype():
for x, y in [
[FrozenSet[int], FrozenSet[str]],
[str, FrozenSet[str]],
[Collection, FrozenSet],
[Tuple[str, ...], Tuple[int, ...]],
[Union[int, str], int],
[Any, str],
[List, Union[int, str]],
[Union[int, str, List], Union[int, str]],
]:
assert not gamla.is_subtype(x, y)