我一直在处理关于lambda
函数的错误,以及它们无法成为pickled
。我经常动态地使用lambda
函数作为一次性使用函数,当我必须单独以函数形式重新创建简单的lambda函数以用于酸洗时,这会大大降低我的工作效率
是否有方法将lambda
及其所有参数转换为Python 3.6.1
中的function
对象?
lambda_func = lambda x: x.split(" ")
def func(x):
return x.split(" ")
input_string = "Darth Plagueis was a Dark Lord of the Sith"
# Function Version
func(input_string)
# ['Darth', 'Plagueis', 'was', 'a', 'Dark', 'Lord', 'of', 'the', 'Sith']
lambda_func(input_string)
# ['Darth', 'Plagueis', 'was', 'a', 'Dark', 'Lord', 'of', 'the', 'Sith']
def lambda2func(lambda_func):
#...
return func_version
pickle
不保存代码对象,只保存其名称。但是,给函数一个名称不足以使其可pickle,因为unpickle
通过导入名称对其进行反序列化。当然,这意味着它必须由取消勾选运行时导入。由于这个原因,带有名称的函数def
仍可能无法pickle。因此,即使您可以将lambda转换为命名函数,这仍然不起作用:你说你不使用
dill
的原因是但是
pickle
序列化格式是可扩展的到任何您喜欢的内部格式-json
,gzip
,甚至dill
。你可以吃蛋糕,也可以吃让我们用
dill
试试,因为这样做很简单:Pickle通常通过递归地Pickle对象的
__dict__
来序列化自定义类实例的状态。在取消勾选时,它可以创建一个未初始化的实例,并用保存的值更新其__dict__
。如果它的所有内容物都可以一直腌制下去,这就行了。但如果不是这样,(就像兰姆达斯的情况一样)酸洗就会失败。但是pickle
模块提供了一个接口来重写此行为:__getstate__()
用于序列化对象的状态,以及__setstate__()
用于从该值还原对象。如果__getstate__()
的返回值是可拾取的(并且__setstate__()
已实现),则此操作有效。在本例中,我们返回由dill.dumps()
返回的pickable bytestring演示:
注意,我们用
pickle
加载了它,而不是dill
!并且lambda没有名称。当然,dill
必须对运行时可用才能取消勾选,但是DillPickle
类的其余部分也必须可用,就像用pickle
序列化的任何自定义类型一样dill
现在只是DillPickle
内部使用的一个实现细节。接口是pickle
您甚至可以将其设置为可调用的,因此您不需要自己添加
.e
相关问题 更多 >
编程相关推荐