__deepcopy__ without recursive copies?
#!/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?
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?
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