У меня есть определенные пользователем словарь (суб-причислять питон встроенный Dict объект), который не позволяет модифицировать Dict непосредственно:Глубокое копирование определенный пользователем словарь питона
class customDict(dict):
"""
This dict does not allow the direct modification of
its entries(e.g., d['a'] = 5 or del d['a'])
"""
def __init__(self, *args, **kwargs):
self.update(*args, **kwargs)
def __setitem__(self,key,value):
raise Exception('You cannot directly modify this dictionary. Use set_[property_name] method instead')
def __delitem__(self,key):
raise Exception('You cannot directly modify this dictionary. Use set_[property_name] method instead')
Моя проблема заключается в том, что я Я не могу глубоко скопировать этот словарь, используя copy.deepcopy. Вот пример:
d1 = customDict({'a':1,'b':2,'c':3})
print d1
d2 = deepcopy(d1)
print d2
, где он бросает исключение я определил себя за SetItem:
Exception: You cannot directly modify this dictionary. Use set_[property_name] method instead
Я попытался перезапись DeepCopy метод следующим образом, как предложил here:
def __deepcopy__(self, memo):
cls = self.__class__
result = cls.__new__(cls)
memo[id(self)] = result
for k, v in self.__dict__.items():
setattr(result, k, deepcopy(v, memo))
return result
Это не вызывает никаких ошибок, но возвращает пустой словарь:
d1 = customDict({'a':1,'b':2,'c':3})
print d1
d2 = deepcopy(d1)
print d2
{'a': 1, 'c': 3, 'b': 2}
{}
Любые идеи, как исправить это?
Наследование, вероятно, не является хорошим решением для этого. Если ваш список не делает ничего, что кортеж не делает, просто используйте кортеж. В противном случае используйте шаблон прокси-шаблона («имеет значение« нет »является«) » – wim
Зачем вам нужно глубоко скопировать неизменный список? – Natecat
Также хороший вопрос! :) – wim