2012-03-26 44 views
3

我正在做一些PloneFormGen的工作。目前PloneFormGen將內部輸入的表單條目存儲爲不帶相關列信息的元組。如果添加新列(表單域),則現有數據將變爲無效。ZODB等效的命令字典(odict?)

這可以很容易地避免將數據存儲在有序字典中,該字典保留輸入的列順序和列ID。

ZODB的數據類型是否等同於有序字典?如果可能的話,即使使用匹配的API(類似Python字典的項目操作和訪問)?

回答

4

你可能不得不建立自己的類,因爲我沒有意識到任何當前的實現。

你可以找到ZODB堅持基於PersistentDict並責令類型的字典OOBtree這裏實現:

https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py

這個實現是基於odict包:

http://pypi.python.org/pypi/odict

由於不可能堅持dict類型繼承對象ts到ZODB(因爲persistent.Persistent和dict具有不兼容的低級別實現)odict提供了一種輕鬆掛接不同基類的方法(在內部全局使用_dict_impl函數)。這就是爲什麼odict包仍然用於Python甚至是Python 2的原因。7的命令字典執行或其他第三方ordereddict實現。

2

werkzeug和paste都提供了命令。你無疑可以爲了你的目的而醃製它們。

0

如果一個Python對象可以被醃製,它可以被保存在ZODB中。

看看PersistantMapping,從我的理解應該是足以創造一個混合類這樣的:

class PersistantOrderedDict(PersistantMapping, OrderedDict): 
+2

PersistentMapping使用對UserDict方法的直接引用,所以有序的字典更新方法將被批量繞過。 – 2012-03-26 09:58:53

+0

@MartijnPieters你是對的。也許持久類是更好的方法。 – Fabian 2012-03-26 10:19:37

5

您可以使用任何命令字典執行亂的盒中ZODB,但必須在每次更改時使用parent = odict_instance或通過將_p_changed設置爲True來更改父對象(引用有序字典實例的對象)。當然,這將爲父母和有序詞典實例創建一個新的持久記錄。

如果你想讓有序的dict實例本身自動檢測到變化,你可能必須建立自己的類,因爲我不知道任何當前的實現。也就是說,這可能非常容易,特別是如果您使用ZODB PersistentMapping類作爲模板來構建相同的有序版本。不幸的是,您不能將該類用作混音,因爲它直接引用UserDict方法而不是使用super()調用(persistent.Persistent不是新風格的類)。

Python 2.7在標準庫中有一個有序的dict類。據推測,你仍然在Plone中使用Python 2.6,所以你不得不將它回溯。但是,一旦您將其恢復後,PersistentOrderedDict實現應該是PersistentMapping source code的直接副本,所有實例UserDict.IterableUserDict都將替換爲OrderedDict端口。