在python中组合几种结构类型

2024-10-16 22:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这样的事情存在吗?我使用协议、有界类型变量等搜索解决方案,但无法使其工作


Tags: 对象from协议typingnotiterableinterr
1条回答
网友
1楼 · 发布于 2024-10-16 22:24:26

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]

相关问题 更多 >