python - 结合python中的几种结构类型

标签 python types type-hinting mypy

如何指定必须满足多个协议(protocol)的对象?例如,假设我需要一个同时满足 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

有这样的东西吗?我使用协议(protocol)、有界 TypeVars 等搜索变通方法,但无法使其工作。

最佳答案

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

有一个关于交叉路口类型的旧开放提案:typing#213 .目前还没有批准。

I searched for work arounds using protocols

你确实可以引入你自己的交集协议(protocol):

_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]

关于python - 结合python中的几种结构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62639015/

相关文章:

xslt - 如何将以数字开头的字符串转换为 XSLT 中的数字数据?

PHP 类型提示特征

python - 将包含字典的 Pandas 列转换为多行

functional-programming - 什么是欣德利米尔纳?

python - 在 Maya 中正确使用 PySide QThread 以避免硬崩溃

MySQL固定长度和可变长度数据类型

python-3.x - 在Python中定义递归类型提示?

没有循环导入的 Python 类型提示

python - Matplotlib 坐标。系统原点到左上角

python - Django:作为值列表查询一部分的相关模型值列表