如何保存我的 class 以在另一个环境中加载

How to save my class to load in another environment

我在概念上想做一些简单的事情:保存一个 python 对象,以后我可以从另一个(不同的)程序访问它。

但问题是它有一个包装器(下面的 f(x))在新环境中没有被引用。

整整花了12个小时,感觉比开始的时候还要迷茫。我认为“泡菜”或“莳萝”等……是我应该做的。但是我 运行 遇到酸洗问题。但是在线阅读让我无所适从。 (顺便说一句,我试过 shap.save 但它有相同的问题领域并且无论如何都使用 pickle)。

import shap, pickle

model = ... (some tensorflow function)

def f(X):
    ...
    return model.predict(...).flatten()
explainer = shap.KernelExplainer(f, X.iloc[:50, :])

with open(f"/tmp/{file}.pkl", 'wb') as fil:
    # explainer.save(fil)
    pickle.dump(explainer, fil)

这不起作用,因为它“找不到 属性 'f'”。这些看起来是我能找到的最有前途的文章,但我无法针对我的场景实施。

http://gael-varoquaux.info/programming/decoration-in-python-done-right-decorating-and-pickling.html

https://github.com/slundberg/shap/issues/295

Python: Can't pickle type X, attribute lookup failed

*** 请在评论中提供有关术语的建议,以改进我提问的方式,因为我不知道如何表达我的提示。

通常,在任何编程语言中,您都不会保存对象,而是将对象的属性保存到文件中。然后你应该创建一个函数来读取文件并将值填充到你的对象中。 您可以将您的对象制作成一个可安装的包,并将该包作为一个对象导入到您的程序中。

import pickle

class A(Object):
     def __init__(self, var1, var2):
         self.var1 = var1
         sefl.var2 = var2
     def dump_obj(self, fn):
         
         pickle.dump(self, fn, pickle.HIGHEST_PROTOCOL)

在您要加载对象并将数据馈送到对象的文件中

import pickle
import file_with_object_A

def load_A(fn):
    with open(fn, 'rb') as file:
        new_a = pickle.load(fn)
        # or alternatively, you can load each attribute into a variable and feed it to your object
        var1, var2 = file.readline(fn)
        my_new_A = A(var1, var2)

记得将详细说明函数 f(X) 的文件导入到新的代码文件中,可以是 的方式,也可以保留此 file 包含 f(X) 在与当前工作文件相同的目录中。

你可以看看这个答案Saving an Object (Data persistence)