我正在做一些PloneFormGen的工作。目前PloneFormGen將內部輸入的表單條目存儲爲不帶相關列信息的元組。如果添加新列(表單域),則現有數據將變爲無效。ZODB等效的命令字典(odict?)
這可以很容易地避免將數據存儲在有序字典中,該字典保留輸入的列順序和列ID。
ZODB的數據類型是否等同於有序字典?如果可能的話,即使使用匹配的API(類似Python字典的項目操作和訪問)?
我正在做一些PloneFormGen的工作。目前PloneFormGen將內部輸入的表單條目存儲爲不帶相關列信息的元組。如果添加新列(表單域),則現有數據將變爲無效。ZODB等效的命令字典(odict?)
這可以很容易地避免將數據存儲在有序字典中,該字典保留輸入的列順序和列ID。
ZODB的數據類型是否等同於有序字典?如果可能的話,即使使用匹配的API(類似Python字典的項目操作和訪問)?
你可能不得不建立自己的類,因爲我沒有意識到任何當前的實現。
你可以找到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實現。
werkzeug和paste都提供了命令。你無疑可以爲了你的目的而醃製它們。
如果一個Python對象可以被醃製,它可以被保存在ZODB中。
看看PersistantMapping,從我的理解應該是足以創造一個混合類這樣的:
class PersistantOrderedDict(PersistantMapping, OrderedDict):
您可以使用任何命令字典執行亂的盒中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端口。
PersistentMapping使用對UserDict方法的直接引用,所以有序的字典更新方法將被批量繞過。 – 2012-03-26 09:58:53
@MartijnPieters你是對的。也許持久類是更好的方法。 – Fabian 2012-03-26 10:19:37