我想静态地强制一个类的方法返回一个包含在某种抽象类型中的值,我对此一无所知:
例如。给出抽象类
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
进行静态检查?
不幸的是,类型系统(如PEP 484中所述)不支持更高级的类型 - 这里有一些相关的讨论:https://github.com/python/typing/issues/548。
mypy和其他类型的检查工具有可能在将来的某个时候获得支持,但我不会屏住呼吸。这将需要一些相当复杂的实现工作来实现。