python - 在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
这样的事情存在吗?我使用协议、有界 TypeVar 等搜索解决方法,但无法使其工作。
解决方案
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]
推荐阅读
- r - 为每个社区提取社区节点和其他节点之间的边列表
- c# - 在 WebApi 控制器中使用 SimpleInjector 的运行时空引用异常
- excel - ADODB 有时不记录数据
- ios - 警告文本字段中的大写[仅第一个单词]
- python-3.x - 使用 if_exists 时 pandas to_sql 失败
- java - 在java中使用O(logn)复杂度比较两个数组列表
- javascript - 从两个不同的模式中删除
- python - 使用 pip 在 Windows 中安装 Airflow 时出错
- web-services - 所有组件或单独实例的共享tomcat服务器?
- reactjs - 无法在 DevExtreme 中旋转 x 轴上的标签