Copying weakrefs

Rick Harris rconradharris at gmail.com
Thu Feb 14 19:51:38 CET 2008


On Feb 14, 12:31 pm, Rick Harris <rconradhar... at gmail.com> wrote:
> 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:
>
> >>> import weakref, copy
> >>> class Test(object): pass
> >>> t = Test()
> >>> wr = weakref.ref(t)
> >>> wr_new = copy.copy(wr) # Fails, not enough args to __new__
>
> 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



More information about the Python-list mailing list