Hello Dieter Maurer,

Saturday, December 10, 2005, 12:32:35 AM, you wrote:

DM> l = range(10)
DM> for f in l: l.remove(f)
DM> l
-->> [1, 3, 5, 7, 9]

DM>   Due to the much more complex BTree structures, the results
DM>   of modifications during iteration might be even more surprising.
I know about this

Hello Tim Peters,

Saturday, December 10, 2005, 1:08:55 AM, you wrote:

TP> The .keys(), .values(), and .items() methods of BTrees are very different
TP> from those methods on dicts in that the BTree methods return lazy iterators
TP> but the dict methods return lists.
I  undestand  that i need keys|values|items cast to list, and from this new list
get the new iterator.

And a funny situation

Starting debugger (the name "app" is bound to the top-level Zope object)
>>> from OFS.ObjectManager import ObjectManager
>>> from OFS.SimpleItem import SimpleItem
>>> m = ObjectManager()
>>> m._setObject('1',SimpleItem())
'1'
>>> m._setObject('2',SimpleItem())
'2'
>>> o_ids = m.objectIds()
>>> o_ids
['1', '2']
>>> m._delObject('1')
>>> o_ids
['1', '2']
>>> from Products.BTreeFolder2.BTreeFolder2 import BTreeFolder2
>>> m = BTreeFolder2()
>>> m._setObject('1',SimpleItem())
'1'
>>> m._setObject('2',SimpleItem())
'2'
>>> o_ids = m.objectIds()
>>> o_ids
<OOBTreeItems object at 0x4015dca0>
>>> list(o_ids)
['1', '2']
>>> m._delObject('1')
>>> list(o_ids)
['2']

I`ll want to migrate my large object containers from Folder to BTreeFolder2, 
but my
code have many next places:

for id in container.objectIds():
   if some_condition:
       container._delObject(id)

or

container.manage_delObjects( container.objectIds() )

Be careful with migration of such type.

-- 
Best regards,
 Victor Safronovich
 NauMen.NauDoc.SoftwareDeveloper  http://www.naumen.ru

_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to