比较两个类型注释(可能是泛型)以查看它们是否合适

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

我正在寻找一个可以判断类型注释是否是另一个类型注释的子集的函数。

它可能位于标准库或第三方库中。由于 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:下标泛型不能与类和实例检查一起使用

高级目标是能够在给定两个函数的情况下确定它们是否可以组合。

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

最终自己针对常见用例实现了这一点(

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)
© www.soinside.com 2019 - 2024. All rights reserved.