Copying weakrefs

R

Rick Harris

I am working with an object, Context, that maintains an identity map
by using the weakref.WeakValueDictionary. I would like to clone this
Context object (and objects that may have a Context object) using
copy.deepcopy(). When I try to do this, the deep copy operation
recurses down to the WeakValueDictionary, down to the KeyedRef
subclass of ref, and then fails. It seems that copy.copy() and
copy.deepcopy() operations on weakrefs just won't work.

The failure can be replicated with this (much simpler) scenario:

Anybody out there have some insight into this?

Thanks
Rick
 
R

Rick Harris

I am working with an object, Context, that maintains an identity map
by using the weakref.WeakValueDictionary. I would like to clone this
Context object (and objects that may have a Context object) using
copy.deepcopy(). When I try to do this, the deep copy operation
recurses down to the WeakValueDictionary, down to the KeyedRef
subclass of ref, and then fails. It seems that copy.copy() and
copy.deepcopy() operations on weakrefs just won't work.

The failure can be replicated with this (much simpler) scenario:


Anybody out there have some insight into this?

Thanks
Rick

Update:

I was able to monkey-patch the copy module's dispatch tables to
(seemingly) fix this.

The code is:
copy._copy_dispatch[weakref.ref] = copy._copy_immutable
copy._deepcopy_dispatch[weakref.KeyedRef] = copy._deepcopy_atomic


Could somebody more familiar with Python internals look into whether
this patch is a) correct and b) whether this should be added to copy
module?

Thanks,
Rick
 
R

Rick Harris

I am working with an object, Context, that maintains an identity map
by using the weakref.WeakValueDictionary. I would like to clone this
Context object (and objects that may have a Context object) using
copy.deepcopy(). When I try to do this, the deep copy operation
recurses down to the WeakValueDictionary, down to the KeyedRef
subclass of ref, and then fails. It seems that copy.copy() and
copy.deepcopy() operations on weakrefs just won't work.

The failure can be replicated with this (much simpler) scenario:


Anybody out there have some insight into this?

Thanks
Rick
Update:

Adding the following monkey-patch seems to fix the problem:
copy._copy_dispatch[weakref.ref] = copy._copy_immutable
copy._deepcopy_dispatch[weakref.KeyedRef] = copy._deepcopy_atomic

Perhaps the copy module should be patched with something along these
lines.

Thanks,
Rick
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top