微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以类型安全的方式预先传递不同类型的可组合函数?

如何解决如何以类型安全的方式预先传递不同类型的可组合函数?

我有一个ValuePropagator

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 举报,一经查实,本站将立刻删除。