2015-03-02 3 views
3

Я экспериментировал с deepcopy от copy. Он хорошо работает с экземпляром OrderedDict и с экземпляром ребенка-диктатора. Но это не работает с экземпляром ребенка OrderedDict. Вот демо:Deep copy of OrderedDict child

from collections import OrderedDict 
from copy import deepcopy 

class Example2(dict): 
    def __init__(self,l): 
     dict.__init__(self,l) 

class Example3(OrderedDict): 
    def __init__(self,l): 
     OrderedDict.__init__(self,l) 

d1=OrderedDict([(1,1),(2,2)]) 
print(deepcopy(d1))   #OrderedDict([(1, 1), (2, 2)]) 

d2=Example2([(1,1),(2,2)]) 
print(deepcopy(d2))   #{1: 1, 2: 2} 

d3=Example3([(1,1),(2,2)]) 
print(deepcopy(d3)) 

Первые два примера работы, как ожидается, но последний падает с исключением:

TypeError: __init__() missing 1 required positional argument: 'l' 

Итак, вопрос: что на самом деле проблема здесь и есть возможность используйте функцию deepcopy для этой ситуации?

+0

Вы должны itterate через него и DeepCopy каждый элемент на его собственный – Vajura

ответ

4

Проблема заключается в конструкторе в вашем классе Example3, deepcopy вызовет конструктор по умолчанию (без аргумента один), но вы не определили это, таким образом, сбой. Если вы измените свое определение конструктора использовать необязательные аргументы для списка вместо этого, он будет работать

Как так

class Example3(OrderedDict): 
    def __init__(self, l = []): 
     OrderedDict.__init__(self, l) 

затем

>>> d3 = Example3([(1, 1), (2, 2)]) 
>>> print(deepcopy(d3)) 
Example3([(1, 1), (2, 2)]) 
+1

Спасибо за ответ. Хотя, я должен признать, что я не совсем понимаю, почему Example2 работает, а в примере3 нет. – Nik

+0

Хороший вопрос! Не могу найти доказательства этого, но подозреваю, что это из-за того, что диктует тип сборки, так что deepcopy может справиться с этим. – Johan

+0

Просто отметим, что у меня такая же ошибка в аналогичном случае, хотя я использовал dict.copy() вместо того, , – paulochf