如何解决如何以类型安全的方式预先传递不同类型的可组合函数?
V = TypeVar("V")
class ValuePropagator(ABC,Generic[V]):
@abstractmethod
def get(self,funcs: Sequence[Callable[[V],V]],value: V) -> V:
pass
示例实现急于传播value
,每次调用funcs
时都会调用get
:
class EagerValuePropagator(ValuePropagator[V],Generic[V]):
def get(self,value: V) -> V:
for func in funcs:
value = func(value)
return value
我还有其他实现各种级别缓存的实现。一个在应用所有funcs
之后缓存最终值,另一个在应用每个func
之后缓存中间值。到目前为止一切都很好。
我的新用例要求中间类型不同于V
。例如,我可能会收到2个funcs
:一个Callable[[V1],V2]
和Callable[[V2],V3]
。然后,给定get
,我的V3
方法将需要返回V1
。
我的第一步是将这些funcs
预先组合成一个Callable[[V1],V3]
。但是ValuePropagator
的许多实现都需要访问单独的funcs
来缓存策略,而传递一个组合的Callable
会占用这种粒度。
如何在保持类型安全的同时将ValuePropagator
更改为在funcs
之间支持多种类型?夫妻规格:
-
通过
Callable[[V1],V2]
和Callable[[V1],V3]
将需要通过类型检查,因为第一个可调用项的输出与第二个可调用项的输入类型不同,从而导致管道失败。 / p> -
我需要能够预先接收所有功能,以便可以对部分累积操作进行缓存,而对其他部分进行缓存。
作为最后的选择,我可以使用Any
保持这种逻辑的类型,但希望您有任何尝试的想法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。