沿着它使用的外部函数保存python对象

时间:2017-03-25 19:10:08

标签: python serialization pickle

我有一些类接受其init参数的函数:

class A(object):

    def __init__(self, some_var, some_function):
        self.some_function = some_function
        self.x = self.some_function(some_var) 

我可以创建一个函数,将它传递给对象的一个​​实例,并使用pickle保存它:

import pickle as pcl

def some_function(x):
    return x*x

a = A(some_var=2, some_function=some_function)

pcl.dump(a, open('a_obj.p', 'wb')) 

现在我想在其他一些代码中打开这个对象。但是,我不想在使用此特定保存对象的每个文件中包含def some_function(x):代码。

那么,最好的python实践是将外部函数作为参数传递给python对象然后保存对象,这样外部函数就可以在对象实例中“实现”,因此不必编写在每个使用保存对象的文件中?

编辑:让我澄清一下,我不想保存这个功能。我只想保存对象。我有任何优雅的方法来“组合”对象内部的外部函数,所以我可以将它作为参数传递,然后它“成为”该对象实例的一部分?

2 个答案:

答案 0 :(得分:1)

您要问的最简单的方法是使用dill模块。

您可以像这样转储对象的实例:

import dill

def f(x):
    return x*x

class A(object):
    def __init__(self, some_var, some_function):
        self.some_function = some_function
        self.x = self.some_function(some_var)

a = A(2, f)

a.x
# returns:
# 4

with open('a.dill', 'wb') as fp:
    dill.dump(a, fp)

然后创建一个新的python实例,你可以使用:

重新加载它
import dill

with open('a.dill', 'rb') as fp:
    a = dill.load(fp)

a.x
# returns:
# 4

a.some_function(4)
# returns:
# 16

答案 1 :(得分:0)

如果你真的,真的想要这样做,可以使用Pickle所基于的Marshal模块。出于安全原因,故意无法进行酸洗功能。

在这个问题中你可能会发现很多信息: Is there an easy way to pickle a python function (or otherwise serialize its code)?