[Zope-dev] Adapter for class with slots

Wolfgang Schnerring ws at gocept.com
Thu Dec 3 03:39:50 EST 2009


Hello,

I've stumbled upon a wrinkly edge case (bug?) in zope.component.

What I was trying to do is register an AbsoluteURL adapter for
lovely.remotetask.processor.ProcessorRequest objects, and since they
don't implement a specific interface, I thought I'd use the class
itself as the required component. But registering the adapter for 
"* lovely.remotetask.processor.ProcessorRequest" fails with a strange
TypeError (see below). The reason is that the class inherits from
zope.publisher.base.BaseRequests which uses __slots__.

The minimal reproduction recipe to see the error is this:

    class Slotted(object):
        __slots__ = ('__provides__')

    zope.component.provideAdapter(
        lambda x: True, (Slotted,), zope.interface.Interface)

Which will raise
  File "/home/wosc/.python-eggs/zope.component-3.7.1-py2.6.egg/zope/component/registry.py",
  line 419, in _getAdapterRequired
      elif not ISpecification.providedBy(r):
  TypeError: 'member_descriptor' object is not callable

Why is this? Can this be made to work? How would I go about
investigating that?

Thanks,
Wolfgang


More information about the Zope-Dev mailing list