在 python 中组合几种结构类型
Combining several structural types in python
如何指定必须满足多个协议的对象?例如,假设我需要一个同时满足 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
我想以某种方式注释一个可以进行所有操作的变量。例如(编造的语法):
T = TypeVar('T')
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]
ri: ReversibleIterable[int] = l
reversed(ri) # fine
iter(ri) # fine
有这种东西吗?我使用协议、有界 TypeVars 等搜索解决方法,但无法使其工作。
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]
有一个关于交叉路口类型的旧提案:typing#213。目前还没有通过。
I searched for work arounds using protocols
你确实可以引入自己的交集协议:
_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]
如何指定必须满足多个协议的对象?例如,假设我需要一个同时满足 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
我想以某种方式注释一个可以进行所有操作的变量。例如(编造的语法):
T = TypeVar('T')
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]
ri: ReversibleIterable[int] = l
reversed(ri) # fine
iter(ri) # fine
有这种东西吗?我使用协议、有界 TypeVars 等搜索解决方法,但无法使其工作。
ReversibleIterable = Intersection[Reversible[T], Iterable[T]]
有一个关于交叉路口类型的旧提案:typing#213。目前还没有通过。
I searched for work arounds using protocols
你确实可以引入自己的交集协议:
_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]