Quiero decapar un objeto y un segundo objeto que hace referencia al primero. Cuando decapito / despojo ingenuamente los dos objetos, la referencia se convierte en una copia. ¿Cómo puedo conservar el enlace entre los dos objetos foo
y bar.foo_ref
?
import pickle class Foo(object): pass foo = Foo() bar = Foo() bar.foo_ref = foo with open('tmp.pkl', 'wb') as f: pickle.dump(foo, f) pickle.dump(bar, f) with open('tmp.pkl', 'rb') as f: foo2 = pickle.load(f) bar2 = pickle.load(f) print id(foo) == id(bar.foo_ref) # True print id(foo2) == id(bar2.foo_ref) # False # want id(foo2) == id(bar2.foo_ref)
Mi respuesta anterior estaba perdiendo su punto. El problema con su código es que no está utilizando los objetos Pickler
y Unpickler
. Aquí hay una versión de trabajo con múltiples llamadas de volcado:
import pickle class Foo(object): pass foo = Foo() bar = Foo() bar.foo_ref = foo f = open('tmp.pkl', 'wb') p = pickle.Pickler(f) p.dump(foo) p.dump(bar) f.close() f = open('tmp.pkl', 'rb') up = pickle.Unpickler(f) foo2 = up.load() bar2 = up.load() print id(foo) == id(bar.foo_ref) # True print id(foo2) == id(bar2.foo_ref) # True
Si los pica juntos, el módulo pickle mantiene un registro de las referencias y solo escurre la variable foo
una vez. ¿Puedes encurtir tanto a foo
como a bar
, así?
import pickle class Foo(object): pass foo = Foo() bar = Foo() bar.foo_ref = foo with open('tmp.pkl', 'wb') as f: pickle.dump((foo, bar), f) with open('tmp.pkl', 'rb') as f: foo2, bar2 = pickle.load(f) print id(foo) == id(bar.foo_ref) # True print id(foo2) == id(bar2.foo_ref) # True
Bueno, ¿puedes hacer?
bar2 = pickle.load(f) foo2 = bar2.foo_ref
Deja que Pickle se encargue del enlace por ti.