__deepcopy__ without recursive copies?

2005-01-25 Thread Bernie
#!/usr/bin/env python
import sys
import copy

'''
How to define __deepcopy__ with out causing recursive calls to copies
of self?

Bernie Day 01/25/05

I was using deepcopy on DeviceManager and this worked well.  When I
defined
__deepcopy__, so I could have a handle to the children of the Master
device Manager
I got into trouble.
I see that there is a method using a dic to limit this, but I can't
seem to get it to work.

This is not the code I was using but should represent it well.

Thanks!
'''


class DeviceManager:
def __init__(self,devFile):
DevFile = open(devFile)
devList = [Device(line) for line in DevFile]
#etc, etc...
def __deepcopy__(self):
miniMe = copy.deepcopy(self)
miniMe.devList = tuple(devList)
return miniMe
class Device:
def __init__(self,line):
self.copyies = []
#do something with line here
def __deepcopy__(self):
miniMe = copy.deepcopy(self)
self.copyies.append(miniMe)
return miniMe

DevMan1 = DeviceManager(devfile)
devMan2 = copy.deepcopy(DevMan1)

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


Re: __deepcopy__ without recursive copies?

2005-01-25 Thread [EMAIL PROTECTED]
Here I found something on __deepcopy__
http://groups-beta.google.com/group/comp.lang.python/browse_frm/thread/c34431c5fd3c223b/427866340239edd7?q=__deepcopy__+example_done=%2Fgroups%3Fq%3D__deepcopy__+example+%26hl%3Den%26lr%3D%26safe%3Doff%26sa%3DN%26tab%3Dwg%26_doneTitle=Back+to+Searchd#427866340239edd7

if applied on your script it gives something like:
-import copy
-class DeviceManager(object):
-def __init__(self,devFile):
-DevFile = open(devFile)
-devList = [Device(line) for line in DevFile]
-#etc, etc...
-
-def __deepcopy__(self, memo):
-x = DeviceManager.__new__(DeviceManager)
-memo[id(self)] = x
-for n, v in self.__dict__.iteritems():
-setattr(x, n, copy.deepcopy(v, memo))
-return x
-
-class Device(object):
-def __init__(self,line):
-self.copies = []
-#do something with line here
-
-def __deepcopy__(self, memo):
-x = Device.__new__(Device)
-memo[id(self)] = x
-for n, v in self.__dict__.iteritems():
-setattr(x, n, copy.deepcopy(v, memo))
-return x
-
-DevMan1 = DeviceManager(r'c:\autoexec.bat')
-DevMan2 = copy.deepcopy(DevMan1)
-
-print DevMan1 is DevMan2
it prints False, so the deepcopy seems to work

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


Re: __deepcopy__ without recursive copies?

2005-01-25 Thread [EMAIL PROTECTED]
In this thread a solution is given on how to work with __deepcopy__:
http://groups-beta.google.com/group/comp.lang.python/browse_frm/thread/c34431c5fd3c223b/427866340239edd7?q=__deepcopy__+example_done=%2Fgroups%3Fq%3D__deepcopy__+example+%26hl%3Den%26lr%3D%26safe%3Doff%26sa%3DN%26tab%3Dwg%26_doneTitle=Back+to+Searchd#427866340239edd7

For you this would give something like:
-import copy
-class DeviceManager(object):
-def __init__(self,devFile):
-DevFile = open(devFile)
-devList = [Device(line) for line in DevFile]
-#etc, etc...
-
-def __deepcopy__(self, memo):
-x = DeviceManager.__new__(DeviceManager)
-memo[id(self)] = x
-for n, v in self.__dict__.iteritems():
-setattr(x, n, copy.deepcopy(v, memo))
-return x
-
-class Device(object):
-def __init__(self,line):
-self.copies = []
-#do something with line here
-
-def __deepcopy__(self, memo):
-x = Device.__new__(Device)
-memo[id(self)] = x
-for n, v in self.__dict__.iteritems():
-setattr(x, n, copy.deepcopy(v, memo))
-   return x
-
-DevMan1 = DeviceManager(r'c:\autoexec.bat')
-DevMan2 = copy.deepcopy(DevMan1)
-
-print DevMan1 is DevMan2

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