python - 通过类型注释对 Python 中的类型构造函数进行抽象

标签 python static-analysis static-typing mypy higher-kinded-types

我想静态地强制类的方法返回一个包装在某种抽象类型中的值,而我对此一无所知:

例如给定抽象类

F = ???    

class ThingF(Generic[F]):
    @abstractmethod
    def action(self) -> F[Foo]:
        ...

我希望能够静态检查这是否无效:

class ThingI(ThingF[List]):
    def action(self) -> Foo:
        ...

因为action不返回List[Foo]

但是,上面的 ThingF 声明甚至无法运行,因为 Generic 期望其参数是类型变量,而我找不到使 F 一个“有洞”的类型变量。

两者

F = TypeVar('F')

T = TypeVar('T')
F = Generic[T]

不起作用,因为 TypeVar 不可下标,或者 Generic[~T] 无法用作类型变量。

基本上我想要的是一个“更高种类的类型变量”,一个类型构造函数的抽象,如果你愿意的话。 IE。意思是“F 可以是任何需要另一种类型来生成具体类型的类型”。

有什么方法可以用 Python 的类型注释来表达这一点,并用 mypy 对其进行静态检查吗?

最佳答案

不幸的是,类型系统(如 PEP 484 中所述)不支持更高种类的类型——这里有一些相关的讨论:https://github.com/python/typing/issues/548 .

mypy 和其他类型检查工具可能会在未来的某个时候获得对它们的支持,但我不会屏住呼吸。这需要一些相当复杂的实现工作才能完成。

关于python - 通过类型注释对 Python 中的类型构造函数进行抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52220962/

相关文章:

python - 正则表达式lookbehind和lookahead未找到任何匹配项

python - 在 ffmpeg 上启用缓存以记录流式传输

Windows 中的 Python os.mknod

Python 如何在没有 linter(PyCharm 检查) Unresolved 引用的情况下迭代 StrEnum

c# - 是否有涵盖变量作用域的代码指标

delphi - 为什么这段代码声明 DISTINCT 类型?

python - 无法在 ubuntu 上使用 pip 安装 mysqlclient

c++ - C++中虚函数的编译时静态类型检查

scala - 如何让 Scala 的类型系统捕获这个 MatchError?

Python键入TypeVar(A,B,covariant = True)是什么意思?