通过类型注释在Python中抽象类型构造函数

问题描述 投票:1回答:1

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

例如。给出抽象类

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]不能用作类型变量。

基本上我想要的是一个“更高的kinded类型变量”,一个类型构造函数的抽象,如果你愿意的话。即“F可以是采用其他类型生产混凝土类型的任何类型”。

有没有办法用Python的类型注释表达这个并用mypy进行静态检查?

python static-analysis static-typing mypy higher-kinded-types
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.