[ZODB-Dev] OOBTree: Persistent Objects as keys
   
    Toby Dickenson
     
    tdickenson@geminidataloggers.com
       
    Tue, 19 Feb 2002 10:31:36 +0000
    
    
  
On Mon, 11 Feb 2002 16:00:52 -0500, Jim Fulton <jim@zope.com> wrote:
>> Your proposed
>> comparison function would raise an exception when comparing 1.0 and =
"hello",
>> right?=20
>
>Right.
>
>> That sounds good.
>
>OK, I'll get some help from the PythonLabs dudes on this.
Below is a script which demonstrates the unicode problem. It needs the
BTree exception patch from http://collector.zope.org/Zope/231
Its unpleasant, but I think the only safe option is for Jim's proposed
new comparison function (for Object-keyed BTrees) to always raise an
exception if either of its two parameters are unicode (but not if they
are both unicode).
Is that reasonable?
def test():
    t =3D BTrees.OOBTree.OOBTree()
    t['ma']=3D1    # First we add some keys to the BTree.
    t['mb']=3D1
    t['mc'+chr(200)]=3D1
    t['md']=3D1
    t['mf']=3D1
    t['mg']=3D1
    t['mh'+unichr(200)]=3D1
    check(t)     # Everything is fine at this point
    del t['mf']  # Now we delete some keys
    del t['md']
    # Everything seems fine. We have had no exceptions,
    # and therefore might reasonably commit the
    # transaction.
    check(t)     # the exception in here is unexpected
def check(t):
    for key in t.keys():
        try:
            if not t.has_key(key):
                print 'key %r curiously not present' % key
        except UnicodeError:
            print 'unicode error looking up key %r' % key
            raise
test()
Toby Dickenson
tdickenson@geminidataloggers.com