【问题标题】:Alternative to nested functions for pickling用于酸洗的嵌套函数的替代方案
【发布时间】:2021-11-01 07:02:20
【问题描述】:

我有一段代码可以从许多较小的函数中生成一个函数,同时让最外面的函数接受一个参数x

换句话说,我有一个输入 x,我需要对 x 进行各种转换,这些转换是在运行时决定的。

这是通过迭代调用这个函数来完成的(它本质上是将一个函数包装在另一个函数中)。

函数如下:

def build_layer(curr_layer: typing.Callable, prev_layer: Union[typing.Callable, int]) -> typing.Callable:

    def _function(x):
        return curr_layer(prev_layer(x) if callable(prev_layer) else x)

    return _function

旁注:如您所见,prev_layer 是否不可调用,它会替换输入 x,因此我使用虚拟整数来指示输入的去向。

问题: 这段代码不能腌制。 我似乎无法找到一种方法来重写这段代码,使其变得可腌制。

注意:我需要将这个对象保存在磁盘上,但也需要在多处理中使用它来为 IPC 腌制(这些函数在那里没有使用,所以从技术上讲它们可以被移动)

我还有这个函数的更复杂版本,它处理多个输入(使用固定聚合函数,在本例中为 torch.cat)我知道这两个可以合并为一个通用函数,一旦我得到它我就会这样做上班。

第二个函数的代码如下:

def build_layer_multi_input(curr_layer: typing.Callable, prev_layers: list) -> typing.Callable:

    def _function(x):
        return curr_layer(torch.cat([layer(x) if callable(layer) else x for layer in prev_layers]))

    return _function

【问题讨论】:

  • 作为层传递的函数是如何定义的?就像我可以想象的那样,一个类只有一个函数列表来实现相同的东西,但可调用的东西仍然需要腌制
  • 这些层是可调用的类,它们本身进行转换。
  • 你能确认它们是可腌制的吗?如果是,那么我可以提供一种解决方案,但如果不是,我需要建议 marshal
  • 你的意思是 调用 build_layer 的结果是不可腌制的吗?函数本身就是。不相关,但我不会让第二个参数不可调用。让调用者提供一个常量函数。
  • pickle 模块不会腌制代码,所以这里有一个基本的误解。

标签: python pickle wrapper python-decorators nested-function


【解决方案1】:

我通过将这些函数的返回值附加到一个类实例来解决这个问题,如this thread.中所述

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多