我有一个非常独特的案例,我的Python程序生成大量动态代码(例如动态生成的类和lambda),并且需要用Pickle保存其状态。我想保留尽可能多的东西,但是仅仅保留不棘手的对象也是可以接受的。
换句话说,我希望能够通过简单地对每个无法刺破的对象执行mydict
来腌制包含一些无法刺破的对象的字典del mydict[unpickleablekey]
。
什么是最简单,最Pythonic的实现方式?
最佳答案
尝试使用无法腌制的实例序列化JSON时遇到了类似的问题。我编写了一个自定义JSON编码器,这可能会对您有帮助。
from json import JSONEncoder
class JsonEncoder(JSONEncoder):
def default(self, obj):
return repr(obj)
然后,您将像这样使用它:
encoded_dict = JsonEncoder().encode(mydict)
with open('dump.pkl', 'w') as f:
pickle.dump(encoded_dict, f)
读回:
import json
with open('dump.pkl', 'r') as f:
decoded_dict = json.loads(pickle.load(f))
需要注意的一件事是,使用repr对值进行编码将导致诸如整数或浮点值之类的事情将转换为字符串表示形式,而不是真实类型。可以增强默认编码器,使其仅在类型不是int,float等类型的情况下才返回repr。