如何捕获本身具有类型槽的python泛型类型的约束?

时间:2019-02-11 16:29:12

标签: python generics type-hinting mypy

我遇到的情况是,一个类在协议的各个实现中都是通用的,而该协议本身具有通用的类型槽,而我找不到用Python类型提示(Mypy可以接受)表达这种方式。

具体地说,我有:

__A = TypeVar('__A', covariant=True)


class IndexableCollection(Protocol, Generic[__A]):
    def __iter__(self) -> Iterator[__A]:
        ...

    def __len__(self) -> int:
        ...

    @overload
    def __getitem__(self, key: int) -> __A:
        ...

    @overload
    def __getitem__(self, index: slice) -> Sequence[__A]:
        ...

现在,我想指定一个NamedTuple,其中成员被限制为上述协议。也许是这样的(这是不正确的,但是我找不到可以接受的变体):

Coll = TypeVar('Coll', bound=IndexableCollection)

class MyTuple(NamedTuple, Generic[Coll]):
    sub_collection: Coll
    ...

理想情况下,我想将元素类型(协议中的通用参数)也用作元组的通用参数。

我需要这个的原因是,实际上,sub_collection成员有时只是一个普通的旧List,而有时可能是一个numpy数组。在使用numpy数组的情况下,绑定是已知的,我需要使用它(用于多维切片)。这意味着在元组定义本身中直接将类型os sub_collection指定为IndexableCollection(非一般而言)不够通用(无法捕获多维可分割性),因此我需要推送理想情况下将其转换为通用类型。

注意-当试图捕获一般类型的类型时,也会发生这种情况,并且可能归结为同一问题(???)

0 个答案:

没有答案