[Zope-dev] make zope.component.registry.Components inherit from dict?
Chris McDonough
chrism at plope.com
Tue Nov 24 01:11:19 EST 2009
Martin Aspeli wrote:
> Hi Chris,
>
> Chris McDonough wrote:
>> Martin Aspeli wrote:
>>> We need to make sure that we're not inventing a different way to achieve
>>> something which is already possible. This will lead to confusion,
>>> because people will have to know "which way" is applicable in a given
>>> situation, and the distinction will seem arbitrary.
>> I fear we are indeed inventing a different way to achieve something which is
>> already possible. We aren't doing it arbitrarily, though: the current way just
>> requires the use of an interface instead of a string. Interface usage for such
>> a simple pattern implies a cognitive load that appears to exceed the pain point
>> of most Python developers who are not already familiar with Zope. So we'd like
>> to ameliorate that as best we can.
>
> I wish I knew what "ameliorate" meant, but I'm sure I agree.
Ha, sorry, I've been writing documentation and trying to sound smart. "fix". ;-)
> My concern is that we also have a pretty large existing user base to
> worry about, and we wouldn't want to confuse them. Or, indeed, new users
> confronted with code that has been written up to this point.
Right.
I don't think there's any way we could further confuse existing users: there
aren't really any existing docs for the``zope.component.registry.Component``
object which would reinforce a set of expectations that would exclude use of a
dict API against it. As far as I can tell, existing user-consumable
documentation documents the threadlocal API only. (I am beginning to think the
broadness of the threadlocal API is itself a problem, but that's another issue
entirely.)
New users confronted with old code: well, we already have this problem, and at
least if we make incremental improvements like this one, we have a shot at
making existing code more readable.
> I think it would be nicer, because we could tell a story like this:
>
> - if you just want a place to store things by name...
> - ... which can be overridden at runtime or customised with local
> components ...
> - ... and you don't care too much about the notion of an interface ...
> - ... then here's the ZCA way to look up a component by name only
>
> To register:
>
> reg = getSiteManager()
> reg['rootfactory'] = MyRoot()
>
> To retrieve:
>
> reg['rootfactory']
>
> To delete:
>
> del reg['rootfactory']
>
>
> The equivalent ideas would be:
>
> reg.registerUtility(MyRoot(), provides=Interface, name='rootfactory')
> getUtility(Interface, name='rootfactory')
> reg.unregisterUtility(provides=Interface, name='rootfactory')
>
> Although I suspect we want a marker interface that's a bit more specific
> than just 'Interface' since we already have some things that register
> interfaces as utility, I think. So maybe:
>
> class IAnonymousUtility(Interface):
> pass
Yup, +1 on all that if it would mean the registry object got a complete dict
API (although I think we'll need to fix the "name must be a string" issue I
sent earlier).
To be honest, I'm not really sure that this pattern has much practical benefit
over inheriting from dict, because it just means more (missing ;-) )
documentation, but I recognize the desire for "internal consistency".
- C
More information about the Zope-Dev
mailing list