10

假设我想使用 mypy 编写一个泛型类,但该类的类型参数本身就是一个泛型类型。例如:

from typing import TypeVar, Generic, Callable

A = TypeVar("A")
B = TypeVar("B")
T = TypeVar("T")


class FunctorInstance(Generic[T]):
    def __init__(self, map: Callable[[Callable[[A], B], T[A]], T[B]]):
        self._map = map

    def map(self, x: T[A], f: Callable[[A], B]) -> T[B]:
        return self._map(f, x)

当我尝试在上面的定义中调用 mypy 时,出现错误:

$ mypy typeclasses.py 
typeclasses.py:9: error: Type variable "T" used with arguments
typeclasses.py:12: error: Type variable "T" used with arguments 

我尝试向T TypeVar' 的定义添加约束,但未能成功。是否有可能做到这一点?

4

2 回答 2

4

目前,在撰写本文时,该mypy项目不支持更高种类的类型。请参阅以下 github 问题:

https://github.com/python/typing/issues/548

于 2019-01-09T23:58:45.447 回答
3

returns软件包现在为 HKT 提供了一些第三方支持。

从他们的文档中复制一个片段

>>> from returns.primitives.hkt import Kind1
>>> from returns.interfaces.container import Container1
>>> from typing import TypeVar

>>> T = TypeVar('T', bound=Container1)

>>> def to_str(arg: Kind1[T, int]) -> Kind1[T, str]:
...   ...

Functor会像

from typing import TypeVar, Generic, Callable

A = TypeVar("A")
B = TypeVar("B")
T = TypeVar("T")


class FunctorInstance(Generic[T]):
    def __init__(
        self, map: Callable[[Callable[[A], B], Kind1[T, A]], Kind1[T, B]]
    ):
        self._map = map

    def map(self, x: Kind1[T, A], f: Callable[[A], B]) -> Kind1[T, B]:
        return self._map(f, x)
于 2020-11-15T16:55:56.233 回答