deepcopy raises TypeError for method/function?

Alex Martelli aleaxit at yahoo.com
Fri Sep 10 08:17:44 CEST 2004


OKB (not okblacke) <BrenBarn at aol.com> wrote:

> Alex Martelli wrote:
> 
> >>       Does anyone have any pointers on this?  It seems that
> >>       certain types 
> >> are safe to deepcopy (even if they're not actually copied) whereas
> >> others are not.  Do I just have to manually typecheck for
> >> functions and methods?  Are there any other types that might raise
> >> such an error? 
> > 
> > You can use copy_reg to register an identity function as the way to
> > 'copy' function and methods, if that floats your boat.  And sure,
> > there are other types that raise errors, imagine copying a file
> > object, a socket, ...!
> 
>       Wasn't someone just saying on another thread, though, that copy
> doesn't "officially" use copy_reg?

Right, it was me -- I was carping about the inconsistency between [a]
claiming that if something ain't in the docs it don't count, [b] telling
people to look in the sources as the ultimate reference.  We're doing
both things, holding both contradictory stances at once, and I don't
like that:-(.  This one bug in the docs we'll fix, of course, but the
overall strategy remains a problem.

> 
>       Anyway, I guess my real question is, is there any safe way to do
> something like
> 
> for a in someList:
>       b = copy.deepcopy(a)
> 
>       . . . without having to know ahead of time what kinds of objects
> are in someList?  I could maybe use try/except to catch failure, but if

Failure is surely possible, since not all types are copyable.  Yes, you
can use a try/except -- but if you enter the except clause the copy
won't have happened, so if you need it you're in trouble.

> deepcopy fails like it did with methods, will it always throw a 
> TypeError, or might it raise some other kind of error?  Alternatively,

TypeError would be normal, but I don't think it can be guaranteed.
Consider...:

In [1]: class X(object):
   ...:     def __init__(self): self.xxx = 44
   ...:     def __getstate__(self): return self.xx  # oops
   ...:     

Here, a copy.deepcopy(X()) will end with AttributeError, because of the
oops... for different kind of oopses you could surely have all kinds of
errors.  'except Exception:" thus seems sounder.

> is there a way to tell without actually attempting the deepcopy whether
> it will be able to copy the object or not?

None I can think of, sorry.


Alex



More information about the Python-list mailing list