Python3: pickle 一个没有副作用的函数

Python3: pickle a function without side effects

我有一个项目 foo 在模块 my_project.my_functions 中。我想以一种无需导入 my_project 即可从其他地方解开它的方式来腌制该函数。 foo 没有任何副作用,所以没有函数外的依赖。

我正在使用 dill 来 pickle foo,但 dill 将其保存为 <function my_project.my_functions.foo>,并在我尝试时抱怨未知的 my_project 模块解开它。

有什么解决办法吗?

我通过从给出的代码和空 globals 字典中重新创建函数来解决它。

在/my_project/module.py:

def f(n):
    return n+1 

在 my_project 中,酸洗函数之前:

import dill
import types
import module

f = types.FunctionType(module.f.__code__,{})

with open("my_func.pkl", 'wb') as fs:
    dill.dump(f, fs)

其他地方:

import dill

with open("my_func.pkl", 'rb') as fs:
    f = dill.load(fs)