Python类型提示:使泛型类型推断与继承一起工作

时间:2018-05-24 11:56:14

标签: python generics typing

假设我有一些抽象的Node类。每个节点应该获取一些输入数据并生成输出数据,每个输出数据都是可能不同的类型。为了使开发更容易,看看Node与其他Node的兼容性,我想使用类型提示,所以我有:

T_In = TypeVar("T_In")
T_Out = TypeVar("T_Out")


class Node(Generic[T_In, T_Out]):
    input_: T_In
    output: T_Out

    def __init__(self, input_: T_In):
        self.input_ = input_
        self.output = None

    def prepare_output(self):
        raise NotImplemented()

    def get_output(self) -> T_Out:
        return self.output

到目前为止一直很好(这当然不是要直接实例化的。)

现在我有一个子类MapNode,它接受​​一些执行实际数据转换的函数。我想使用函数的类型签名来自动确定Node类的类型。更具体地说,此节点始终采用某种类型的列表(相当于函数的输入类型),并生成另一种类型的列表(函数输出类型)。我试过的是:

T_Lambda_In = TypeVar("T_Lambda_In")
T_Lambda_Out = TypeVar("T_Lambda_Out")
New_IT = TypeVar("New_IT", bound=List[T_Lambda_In])
New_OT = TypeVar("New_OT", bound=List[T_Lambda_Out])

class MapNode(Node[New_IT, New_OT]):
    def __init__(self, input_, lambda_: Callable[[T_Lambda_In], T_Lambda_Out]):
        super(Node, self).__init__(input_)
        self.lambda_ = lambda_

    def prepare_output(self):
        self.output = [self.lambda_(obj) for obj in self.input_]

一个功能可以是,例如:

def cast_int(val: str) -> int:
    return int(val)

我的想法是,这应该生成类型提示:

node: MapNode[List[str], List[int]] = MapNode(["1", "2"], lambda_=cast_int)

相反,PyCharm生成:

node: MapNode[Any, Any] = MapNode(["1", "2"], lambda_=cast_int)

似乎函数签名中类型的使用不足以正确解析“派生”类型T_Lambda_InT_Lambda_Out。任何帮助解决这个问题将不胜感激!我顺便使用Python 3.6。

0 个答案:

没有答案