这是使用的实现。
from collections import OrderedDict
class ListDict(OrderedDict):
def __init__(self, *args, **kwargs):
super(ListDict, self).__init__(*args, **kwargs)
def __insertion(self, link_prev, key_value):
key, value = key_value
if link_prev[2] != key:
if key in self:
del self[key]
link_next = link_prev[1]
self._OrderedDict__map[key] = link_prev[1] = link_next[0] = [link_prev, link_next, key]
dict.__setitem__(self, key, value)
def insert_after(self, existing_key, key_value):
self.__insertion(self._OrderedDict__map[existing_key], key_value)
def insert_before(self, existing_key, key_value):
self.__insertion(self._OrderedDict__map[existing_key][0], key_value)
使用它的方式如下:
ld = ListDict([(1,1), (2,2), (3,3)])
ld.insert_before(2, (1.5, 1.5))
提供
File "...", line 35, in insert_before
self.__insertion(self._OrderedDict__map[existing_key][0], key_value)
AttributeError: 'ListDict' object has no attribute '_OrderedDict__map'
它适用于Python 2.7。它在Python 3中失败的原因是什么?
检查OrderedDict实现的源代码显示使用self.__map
而不是self._OrderedDict__map
。将代码更改为使用self.__map
会得到
AttributeError: 'ListDict' object has no attribute '_ListDict__map'
我该怎么做?如何在Python 3中实现?OrderedDict使用内部的
__map
属性来存储双向链表。那么我该如何正确地访问这个属性?
self.__map
不起作用,请参考这个问题。至于为什么这段代码在 Python2 中可以工作但在 Python3 中不行,我不知道。 - Aran-FeyOrderedDict
在Python 3.5中进行了重构,以便使用C而不是Python(https://bugs.python.org/issue16991),因此以前的私有结构`self.__map`可能在Python中不再可访问。这就是为什么当开发人员使用他们所拥有的一点点东西来表达某些东西在Python中不应该被搞乱时,你应该听取并且不要在你的子类中尝试依赖它的原因。 - Two-Bit Alchemist