[Grok-dev] Re: Iterativly emptying a grok.container shows weird behavior

Brandon Craig Rhodes brandon at rhodesmill.org
Tue Jun 12 12:41:09 EDT 2007

Philipp von Weitershausen <philipp at weitershausen.de> writes:

> Brandon Craig Rhodes wrote:
>> If Volker is unhappy getting a huge list from .keys(), he can call
>> .iterkeys() instead.  Please review the Python interface for
>> mapping types...
> When the BTree mapping type was conceived, Python didn't know
> iterators ... it's a combination of efficiency and legacy ...  It's
> not called iterkeys() because our BTree implementation in the ZODB
> has been around for about 10 years.

Please understand that my criticism here is a very modest one; I would
never criticize someone for not being able to guess ahead of time what
lazy dictionary iterators were going to be named! :-)

My only wish is to support the Volker - who was, after all, quite
funny, and deserves our support - in two quite modest contentions:

 - The .keys() method of BTrees should never have been named .keys()
   because, even back at the time it was first written, it conflicted
   with a Python convention for how .keys() behaves, and consequently
   broke several common programming idioms.  It would have been far
   friendlier not to have .keys() at all than to provide a
   non-standard one.

   Having the programmer remember "this class is wierd and I have to
   call (for example) .travelkeys() rather than .keys()" is no more
   difficult than having them remember ".keys() on this class is
   actually a dynamic traversal that breaks common idioms", and has
   the vast benefit that if they forget and try to call .keys(), they
   would get a straightforward error to remind them that "This Class
   Is Different", rather than getting strange results.

 - Now that Python has in fact grown its own lazy-iteration protocol,
   BTrees should move to adopt it; at the very least, BTrees should
   grow an .iterkeys() method which could begin as a synonym for the
   current .keys() function, so that new code can begin using plain
   Python idiom.  Readability would at least be enhanced, even if no
   one could agree upon a timetable for ever having .keys() revert to
   Pythonic behavior.

Brandon Craig Rhodes   brandon at rhodesmill.org   http://rhodesmill.org/brandon

More information about the Grok-dev mailing list