[Zope3-dev] possible bug in catalog code

Martijn Faassen faassen at infrae.com
Thu Jul 7 06:25:43 EDT 2005


Hi there,

in zope.app.catalog.attribute, there's the following functionality:

     def index_doc(self, docid, object):
         if self.interface is not None:
             object = self.interface(object, None)
             if object is None:
                 return None

         value = getattr(object, self.field_name, None)
         if value is None:
             return None

         if self.field_callable:
             try:
                 value = value()
             except:
                 return None

         return super(AttributeIndex, self).index_doc(docid, value)

The following sequence I think leads to trouble:


         value = getattr(object, self.field_name, None)
         if value is None:
             return None

as this means attributes that do exist and have the value None would 
never be indexed (as index_doc() is never reached).

Instead, I'd suggest the following code:

         try:
             value = getattr(object, self.field_name)
         except AttributeError:
             return None

or alternatively if for some reason getattr() with a default is 
preferred (though I suspect the exception approach is slightly faster):

# module level
NotFound = object()

         value = getattr(object, self.field_name, NotFound)
         if value is NotFound:
              return None

If this is indeed decided to be a bug, is it okay if I check in a fix 
for this? I'll try to devise a test of course.

Regards,

Martijn


More information about the Zope3-dev mailing list