Hi! I had problems to delete all entries from a BTree. The working code is now: (self.objects is a BTreeFolder2) def deleteAllObjects(self): "docstring" keys=[] for k in self.objects.keys(): keys.append(k) len_keys=len(keys) i=0 for k in keys: self.objects[k].deleteObject() i+=1 ret=[] ret.append(self.standard_html_header()) ret.append("All objects where deleted %s %s" % (len_keys, i)) ret.append(self.standard_html_footer()) return ''.join(ret) This does not work: for k in self.objects.values(): k.deleteObject() # k gets deleted from self.objects since deleting while iterating does not work. This code does not look very nice. Is there a better way? It would be nice to use just on loop. thomas -- Thomas Guettler <guettli@thomas-guettler.de> http://www.thomas-guettler.de
Thomas Guettler wrote:
Hi!
I had problems to delete all entries from a BTree. The working code is now:
(self.objects is a BTreeFolder2)
def deleteAllObjects(self): "docstring" keys=[] for k in self.objects.keys(): keys.append(k) len_keys=len(keys) i=0 for k in keys: self.objects[k].deleteObject() i+=1 ret=[] ret.append(self.standard_html_header()) ret.append("All objects where deleted %s %s" % (len_keys, i)) ret.append(self.standard_html_footer()) return ''.join(ret)
This does not work: for k in self.objects.values(): k.deleteObject() # k gets deleted from self.objects since deleting while iterating does not work.
This code does not look very nice. Is there a better way? It would be nice to use just on loop.
Would you also go without any explicit loops? ;) self.manage_delObjects(self.objectIds()) HTH, oliver
On Mon, Apr 07, 2003 at 06:28:30PM +0200, Oliver Bleutgen wrote:
Thomas Guettler wrote:
Hi!
I had problems to delete all entries from a BTree.
self.manage_delObjects(self.objectIds())
The result: Error Type: TypeError Error Value: object doesn't support item deletion Traceback (innermost last): * Module ZPublisher.Publish, line 98, in publish * Module ZPublisher.mapply, line 88, in mapply * Module ZPublisher.Publish, line 39, in call_object * Module Products.OOPServer.Demo.Demo, line 200, in deleteAllObjects * Module OFS.ObjectManager, line 448, in manage_delObjects TypeError: object doesn't support item deletion My object is inherited from the following classes: SimpleItem, Persistent, Implicit, CatalogAware The container is a BTreeFolder2. objectIds() does not return a list, but: <OOBTreeItems object at 0x93b1a68> BTW, the problem is not important, because my code works. I am just looking for cleaner solution. thomas -- Thomas Guettler <guettli@thomas-guettler.de> http://www.thomas-guettler.de
Thomas Guettler wrote:
* Module ZPublisher.Publish, line 98, in publish * Module ZPublisher.mapply, line 88, in mapply * Module ZPublisher.Publish, line 39, in call_object * Module Products.OOPServer.Demo.Demo, line 200, in deleteAllObjects * Module OFS.ObjectManager, line 448, in manage_delObjects
TypeError: object doesn't support item deletion
My object is inherited from the following classes: SimpleItem, Persistent, Implicit, CatalogAware
The container is a BTreeFolder2.
objectIds() does not return a list, but: <OOBTreeItems object at 0x93b1a68>
BTW, the problem is not important, because my code works. I am just looking for cleaner solution.
thomas
My mistake, I was looking at BTreeFolder1 at that time. I was sure that would work to. Arguably this is either a bug in ObjectManager or in BTreeFolder2 , since BTreeFolder2 doesn't return something that ObjectManagers manage_delObjects recognizes as sequence type. Since manage_delObjects wants to be smart, it also accepts single strings (in contrast to a sequence with a single object) as an argument. This causes it to try to delete an object of type "OOBTreeItems", which is what objectIds returns for BTreeFolder2 objects. This causes the error you see. To make a long story short, self.manage_delObjects(list(self.objectIds())) works, tuple() should work, too. cheers, oliver
Thomas Guettler wrote at 2003-4-7 18:53 +0200:
self.manage_delObjects(self.objectIds())
The result:
Error Type: TypeError Error Value: object doesn't support item deletion
Try: self.manage_delObjects(list(self.objectIds())) "manage_delObjects" wants to get a list passed, not a tuple. Dieter
Dieter Maurer wrote:
self.manage_delObjects(list(self.objectIds()))
"manage_delObjects" wants to get a list passed, not a tuple.
Uhm, this shows what I wrote in another mail about what ObjectManager does is very wrong, I should have looked at the source. Can anybody explain why manage_delObjects in ObjectManager uses this code to delete objects: while ids: id=ids[-1] v=self._getOb(id, self) if v is self: raise 'BadRequest', '%s does not exist' % escape(ids[-1]) self._delObject(id) del ids[-1] instead of just using a "for id in ids:" loop? Just curios. oliver
participants (3)
-
Dieter Maurer -
Oliver Bleutgen -
Thomas Guettler