在python中组合几种结构类型

Qua*_*um7 6 python types type-hinting mypy

如何指定一个必须满足多个协议的对象?例如,假设我需要一个同时满足Reversible和 的对象Iterable

from typing import Iterable, Reversible

l = [1, 2, 3]
r: Reversible[int] = l
i: Iterable[int] = l
reversed(r)  # fine
iter(i)  # fine
reversed(i)  # err since not iterable
iter(r)  #err since not reversible
Run Code Online (Sandbox Code Playgroud)

我想以某种方式注释一个可以进行所有操作的变量。例如(组成语法):

T = TypeVar('T')
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]

ri: ReversibleIterable[int] = l
reversed(ri)  # fine
iter(ri)  # fine
Run Code Online (Sandbox Code Playgroud)

这样的事情存在吗?我使用协议、有界 TypeVar 等寻找解决方法,但无法使其工作。

hoe*_*ing 4

ReversibleIterable = Intersection[Reversible[T], Iterable[T]]

有一个关于交叉类型的旧开放提案:typing#213。目前尚未获得批准。

我使用协议寻找解决方法

您确实可以引入自己的交叉协议:

_T_co = TypeVar("_T_co", covariant=True)


class ReversibleIt(Reversible[_T_co], Iterable[_T_co], Protocol[_T_co]):
    pass


r: ReversibleIt[int] = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)