Вы можете использовать любую упорядоченную реализацию Dict вне коробки в ZODB, но вы должны будете пометить родительский объект (объект, который относится к упорядоченному экземпляру dict), который был изменен с помощью parent = odict_instance
каждый раз, когда вы его изменяете, или установив _p_changed
в True
. Это, конечно же, приведет к появлению новой постоянной записи для родителя вместе с упорядоченным экземпляром dict.
Если вы хотите, чтобы упорядоченный экземпляр dict автоматически обнаруживал изменения, вам, вероятно, придется создавать свой собственный класс, поскольку мне неизвестны какие-либо текущие реализации. Тем не менее, это, вероятно, очень легко сделать, особенно если вы используете класс ZODB PersistentMapping
в качестве шаблона о том, как создать упорядоченную версию. Вы не можете использовать этот класс как mixin, к сожалению, поскольку он ссылается непосредственно на методы UserDict вместо использования вызовов super()
(persistent.Persistent
не является классом нового стиля).
Python 2.7 имеет упорядоченный класс dict в стандартной библиотеке. Предположительно, вы по-прежнему используете Python 2.6 в Plone, поэтому вам придется его поддерживать. Однако, если у вас есть это backported, реализация PersistentOrderedDict
должна быть прямой копией из PersistentMapping
source code, причем все экземпляры UserDict.IterableUserDict
заменены на ваш порт OrderedDict.
PersistentMapping использует прямые ссылки на методы UserDict, поэтому упорядоченные методы обновления dict будут обойдены оптовой торговлей. –
@MartijnPieters вы правы. Может быть, упорный класс - лучший подход. – Fabian