how to copy a Python object

2006-02-07 Thread mitsura
Hi,

I am new to Python and OO programming.
I need to copy a Python object (of a class I made myself).
new_obj = old_object doesn't seem to work since apparently new_obj is
then a referrence to old_obj.

I found out that there is a module called 'copy' that allows you to do
a shallow or a deep copy.
I need a deep copy since my object contains dicts to other objects that
also need to be copied.

However, when I do new_object = copy.deepcopy(old_object) I get a
series of errors. The most important one:

TypeError: object.__new__(PySwigObject) is not safe, use
PySwigObject.__new__()


So any help much appreciated.

With kind regards,

Kris

I am using Python 2.4

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to copy a Python object

2006-02-07 Thread [EMAIL PROTECTED]

[EMAIL PROTECTED] a écrit :

 Hi,

 I am new to Python and OO programming.
 I need to copy a Python object (of a class I made myself).
 new_obj = old_object doesn't seem to work since apparently new_obj is
 then a referrence to old_obj.

it is


 I found out that there is a module called 'copy' that allows you to do
 a shallow or a deep copy.
 I need a deep copy since my object contains dicts to other objects that
 also need to be copied.

yes but ...


 However, when I do new_object = copy.deepcopy(old_object) I get a
 series of errors. The most important one:
 
 TypeError: object.__new__(PySwigObject) is not safe, use
 PySwigObject.__new__()
 

you see ?
that illustrates there is no general solution to the deep copy problem


 So any help much appreciated.

just provide your own copy() operator on your class
you and only you can know how deep you want to copy things (it just
depends on the nature of said things)

 
 With kind regards,
 
 Kris
 
 I am using Python 2.4

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to copy a Python object

2006-02-07 Thread mitsura
Already thanks for the reply,

but how to write your own copy operator? Won't you always be passing
referrences to new_obj?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to copy a Python object

2006-02-07 Thread Schüle Daniel
[EMAIL PROTECTED] wrote:
 Already thanks for the reply,
 
 but how to write your own copy operator? Won't you always be passing
 referrences to new_obj?

for example this would work

  class X(object):
... def __init__(self,lst):
... self.lst = lst
... def copy(self):
... return X(self.lst[:])
... def __str__(self):
... return lst has id %i % id(self.lst)
...
  x=X([1,2,3])
  y=x.copy()
  print x
lst has id 1078097132
  print y
lst has id 1078097228


but I don't like that in this case self.lst must be passed
through __init__
I can think of another variant

  class Y(object):
... def fill(self):
... self.lst = [randint(i*10,(i+1)*10) for i in xrange(5)]
... def __repr__(self):
... return lst has id = %i % id(self.lst)
... def copy(self):
... ret = Y()
... ret.lst = self.lst[:]
... return ret
...
  from random import randint
  y=Y()
  y.fill()
  y
lst has id = 1078097452
  print y
lst has id = 1078097452
  x=y.copy()
  x
lst has id = 1078097004

... anyone?
are there better approaches?

Regards, Daniel

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to copy a Python object

2006-02-07 Thread Juho Schultz
[EMAIL PROTECTED] wrote:
 Already thanks for the reply,
 
 but how to write your own copy operator? Won't you always be passing
 referrences to new_obj?
 

If you need to modify the behaviour of copy or deepcopy, you can give 
your class __copy__ and __deepcopy__ methods. Then copy.copy and 
copy.deepcopy will use these. As a silly example, you could use:

def __copy__(self):
 raise IOError, 'Permission denied.'

http://www.python.org/doc/2.4.2/lib/module-copy.html
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how to copy a Python object

2006-02-07 Thread Alex Martelli
Schüle Daniel [EMAIL PROTECTED] wrote:
   ...
   class X(object):
 ... def __init__(self,lst):
 ... self.lst = lst
 ... def copy(self):
 ... return X(self.lst[:])
 ... def __str__(self):
 ... return lst has id %i % id(self.lst)
   ...
 ... anyone?
 are there better approaches?

def __getstate__(self): return self.lst

def __setstate__(self, L): self.lst = L

and copy an instance x of X with copy.copy(x) [[after import copy, of
course]].  This will also support pickling c.  getstate/setstate are
generally the best approach.  An equally good alternative here, omit
setstate and just:

def __getstate__(self): return dict(lst=self.lst)


Alex

-- 
http://mail.python.org/mailman/listinfo/python-list