Сосредоточенные объекты

Я хочу рассортировать объект и второй объект, который ссылается на первый. Когда я наивно размалываю/распаковываю два объекта, ссылка становится копией. Как сохранить связь между двумя объектами foo и 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)

Ответ 1

В моем предыдущем ответе отсутствовала ваша точка. Проблема с вашим кодом заключается в том, что вы не используете объекты Pickler и Unpickler. Здесь рабочая версия с несколькими вызовами дампа:

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

Ответ 2

Если вы соберете их вместе, модуль рассола отслеживает ссылки и только разжигает переменную foo один раз. Можете ли вы солить оба foo и bar вместе, как это?

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

Ответ 3

Хорошо, можете ли вы сделать:

bar2 = pickle.load(f)
foo2 = bar2.foo_ref

Пусть маринование обрабатывает ссылку для вас.