Gregor Lingl wrote: > Hi all of you, > > I've some Vector class, which is a subclass of tuple and which is > working satisfactorily since long in different contexts. Now I've > constructed objects with attributes of Vec-type, which I wanted to > deepcopy. But that doesn't work, because I can't (deep)copy Vec-s: > > >>> from copy import deepcopy > >>> class Vec(tuple): > def __new__(cls, x, y): > return tuple.__new__(cls, (x,y)) > def __abs__(self): > return (self[0]**2+self[1]**2)**0.5 > ## more methods ... > > > >>> a=Vec(3,4) > >>> abs(a) > 5.0 > >>> b = deepcopy(a) > > Traceback (most recent call last): > File "<pyshell#13>", line 1, in -toplevel- > b = deepcopy(a) > File "C:\Python24\lib\copy.py", line 204, in deepcopy > y = _reconstruct(x, rv, 1, memo) > File "C:\Python24\lib\copy.py", line 336, in _reconstruct > y = callable(*args) > File "C:\Python24\lib\copy_reg.py", line 92, in __newobj__ > return cls.__new__(cls, *args) > TypeError: __new__() takes exactly 3 arguments (2 given)
Apparently you need to define __getnewargs__() for your class. This works: def __getnewargs__(self): return (self[0], self[1]) __getnewargs__() is documented with the pickle module but it is used by deepcopy() as well. http://docs.python.org/lib/pickle-inst.html Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor