[Zope-dev] make zope.component.registry.Components inherit from dict?

Chris McDonough chrism at plope.com
Tue Nov 24 01:39:04 EST 2009

Chris McDonough wrote:
> Thanks.  Yup. I would be +1 on this if the registry itself implemented 
> IDictInterface.
> If that was untenable, if all the above code lived in the zope.component 
> package itself, and you had an API that manifested an IDictInterface object 
> when you asked for a "utilities" attribute, that would also be acceptable, as 
> long as you could do:
> reg.utils['root_factory'] = RootFactory
> Where the registry implementation would implement a propery for "utils":
> class Components(object):
>      @property
>      def utils(self, name):
>          api = self.queryAdapter(IDictInterface, None)
>          if api is None:
>              api = DictInterface(self)
>          return api
> In reality, this will be slow, and nobody is going to override IDictInterface, 
> so it would probably be better as:
> class Components(object):
>      def __init__(self, name='', bases=()):
>          self.utils = DictInterface(self)

OK after rereading this, I think we may be massively overthinking this.  The 
above is getting kinda silly.  I can't think of a use case where being able to 
alternate between:



   reg.getUtility(IAnonymousUtility, name='root_factory')

... is at all useful.  I may be wrong.  Can you think of one?

If not, it's a lot easier to document:

"The utils attribute of a registry is a dictionary that may contain arbitrary 
key/value pairs."

Than it is to document:

"The utils attribute of a registry is a DictInterface which exposes the Python 
dictionary API which does unnamed utility registrations using the 
IAnonymousUtility interface as the utility interface and the key value passed 
to the various API methods as the utility name...... <and so on>"

Could maybe we instead just do:

  class Components(object):
       def __init__(self, name='', bases=()):
           self.utils = {}

This would be faster, simpler to document, and would require exactly one line 
of code.

- C

More information about the Zope-Dev mailing list