简体   繁体   English

python:带有用户定义的类名和路径的pickle对象

[英]python: pickle object with a user defined class name and path

Here is the problem: I have a set of pickle files with objects and it takes large computing time (like ~2 months) to recreate those objects.问题是:我有一组带有对象的pickle文件,重新创建这些对象需要大量的计算时间(比如~2个月)。 I need to convert those objects ( class A stored in file Av1.py ) into a new class ( class A stored in file Av2.py ) objects but save them such that during loading pickle would search for class A in Av1.py such that later I could just rename Av2.py => Av1.py and have the new objects interpreted as having type of class A stored in the original file Av1.py .我需要将这些对象(存储在文件Av1.py class A )转换为一个新类(存储在文件Av2.py class A )对象,但要保存它们,以便在加载 pickle 期间会在Av1.py搜索class A ,这样后来我可以重命名Av2.py => Av1.py并将新对象解释为具有存储在原始文件Av1.pyclass A类型。 How can I do it?我该怎么做?

Here is an example:下面是一个例子:

# Av1.py
class A:
    def __init__(self, x):
        self.x = x
# Av2.py
class A:
    def __init__(self, y):
        self.y = y
# python session 1
from Av1 import A as Av1
from Av2 import A as Av2

def convert(av1): return Av2(av1.x+1)

av1 = Av1(1)
av2 = convert(av1)

import pickle, gzip
with gzip.open('o.gzpkl', 'wb', compresslevel=9) as f:
    pickle.dump(av2, f, protocol=pickle.HIGHEST_PROTOCOL)
mv Av2.py Av1.py # Linux shell command to rename file Av2.py into Av1.py
# python session 2
import pickle, gzip
with gzip.open('o.gzpkl', 'rb') as f:
    av = pickle.load(f)

Expected result: python session 1 is modified such that python session 2 works and interprets the object in o.gzpkl as having type Av1.A .预期结果: python session 1被修改,使得python session 2工作并将o.gzpkl的对象解释为具有Av1.A类型。

Thank you very much for your help!非常感谢您的帮助!

Here is the solution: I need to do the following before writing av2这是解决方案:我需要在编写av2之前执行以下操作

av2.__class__ = Av1

ie python session 1 should bepython session 1应该是

from Av1 import A as Av1
from Av2 import A as Av2

def convert(av1): return Av2(av1.x+1)

av1 = Av1(1)
av2 = convert(av1)

av2.__class__ = Av1 # solution !!!!

import pickle, gzip
with gzip.open('o.gzpkl', 'wb', compresslevel=9) as f:
    pickle.dump(av2, f, protocol=pickle.HIGHEST_PROTOCOL)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM