2015-03-01 3 views
0

Мой класс унаследован от OrderedDict, и я хочу повторно инициализировать словарь. Но упрощенный код ниже изменяет только значения ключей - порядок элементов остается тем же:Упорядоченная реинициализация: заказ потерян

from collections import OrderedDict 

class Example(OrderedDict): 
    def __init__(self,d): 
     OrderedDict.__init__(self,d) 
     #something that should be done only once - at instance creation 

    def reinit(self,d): 
     OrderedDict.__init__(self,d) 

d=Example([(1,1),(2,2)]) 
d.reinit([(2,20),(1,10)]) 

print(d) #Example([(1, 10), (2, 20)]) 

Таким образом, вопрос: что происходит внутри OrderedDict.__init__ здесь и он должен работать таким образом?

ответ

2

OrderedDict.__init__() не читает словарь. Он просто использует эквивалент self.update(), чтобы добавить элементы в словарь. Все, что вы сделали, это добавить уже существующие ключи.

Вы должны были бы сначала удалить эти ключи или очистить словарь в целом:

def reinit(self, d): 
    self.clear() 
    OrderedDict.__init__(self, d) 

Демо:

>>> from collections import OrderedDict 
>>> class Example(OrderedDict): 
...  def reinit(self, d): 
...   self.clear() 
...   OrderedDict.__init__(self, d) 
... 
>>> d=Example([(1,1),(2,2)]) 
>>> d.reinit([(2,20),(1,10)]) 
>>> print(d) 
Example([(2, 20), (1, 10)]) 

Вы всегда можете посмотреть на исходный код для большинства модулей библиотеки Python; collections documentation связывает вас с source code with the OrdededDict class.

Смежные вопросы