On Feb 14, 12:31 pm, Rick Harris <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list