假设我有一些抽象的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_In
和T_Lambda_Out
。任何帮助解决这个问题将不胜感激!我顺便使用Python 3.6。