OrderedDictに特定の位置に項目を挿入したいとします。だから私はそれは、Pythonで動作しないという問題がある答えるgistthisのを使用して 3.Python 3でOrderedDictの挿入を実装する方法
これは、実装が
ld = ListDict([(1,1), (2,2), (3,3)])
ld.insert_before(2, (1.5, 1.5))
が
を与える のようにそれを使用して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)
を使用しています
File "...", line 35, in insert_before
self.__insertion(self._OrderedDict__map[existing_key][0], key_value)
AttributeError: 'ListDict' object has no attribute '_OrderedDict__map'
wi thのPython 2.7。 Python 3で失敗する理由は何ですか? OrderedDictのソースコードを確認すると、self._OrderedDict__map
の代わりにself.__map
が使用されています。コードをself.__map
に変更すると、
AttributeError: 'ListDict' object has no attribute '_ListDict__map'
どのようになりますか?そして、私はこの作品をPython 3で作ることができますか? OrderedDictは内部の__map
属性を使用して、二重リンクリストを格納します。だから私はこの属性に正しくアクセスできますか?
なぜ 'self .__ map'が動作しないのかについては、[この質問]を参照してください(http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a- Pythonのオブジェクト名の前に二重下線を付ける)。 Python2ではなくPython3で動作する理由については分かりません。 –
非常に役に立ちました、ありがとう。この二重アンダースコアルールを知っていましたか?しかし、それは質問に答えることはできません。 – maggie
'OrderedDict'は[PythonではなくPython 3.5でCになるように]再配布されました(https://bugs.python.org/issue16991)。おそらく以前の' self .__ map'だったプライベート構造はアクセスできなくなりましたPythonで。これは、開発者がPythonで混乱しないようにするために利用できるものをほとんど使用しない場合、サブクラスでそれを頼りにしてはいけません。 –