Реализация рекурсии с глубокой копией - PullRequest
2 голосов
/ 08 июня 2011

Как я могу реализовать рекурсию в объекте функции глубокого копирования?Это соответствующий код (если вы хотите больше, пожалуйста, спросите): PS: я бы хотел, чтобы рекурсия прошла через отфильтрованный список ссылок.Цель состоит в том, чтобы загрузить и вставить все отсутствующие объекты.

copy.py

from put import putter

class copier:
  def __init__(self, base):
    self.base = base
  def copyto(self, obj):
    put = putter(obj)
    for x in self.base.__dict__:
      put(x)

put.py

class putter:
  def __init__(self, parent):
    self.parent = parent
  def put(self, name, obj):
    self.parent.__dict__[name] = obj

1 Ответ

2 голосов
/ 08 июня 2011

Ознакомьтесь с документацией для copy.deepcopy, если вы можете реализовать то, что вы хотите с __getinitargs__(), __getstate__() и __setstate__(), тогда это избавит вас от многих неприятностей.В противном случае вам нужно будет переопределить его самостоятельно, оно должно выглядеть примерно так:

def deepcopyif(obj, shouldcopyprop):
    copied = {} # Remember what has already been copied
    def impl(obj):
        if obj in copied:
            return copied[obj]
        newobj = *** Create a copy ***
        copied[obj] = newobj # IMPORTANT: remember the new object before recursing
        for name, value in obj.__dict__: # or whatever...
            if shouldcopyprop(obj.__class__, name): # or whatever
                value = impl(value) # RECURSION: this will copy the property value
            newobj.__dict__[prop] = value
        return newobj
    return impl(obj)
...