簡體   English   中英

python:帶有用戶定義的類名和路徑的pickle對象

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

問題是:我有一組帶有對象的pickle文件,重新創建這些對象需要大量的計算時間(比如~2個月)。 我需要將這些對象(存儲在文件Av1.py class A )轉換為一個新類(存儲在文件Av2.py class A )對象,但要保存它們,以便在加載 pickle 期間會在Av1.py搜索class A ,這樣后來我可以重命名Av2.py => Av1.py並將新對象解釋為具有存儲在原始文件Av1.pyclass A類型。 我該怎么做?

下面是一個例子:

# 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)

預期結果: python session 1被修改,使得python session 2工作並將o.gzpkl的對象解釋為具有Av1.A類型。

非常感謝您的幫助!

這是解決方案:我需要在編寫av2之前執行以下操作

av2.__class__ = Av1

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)

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