[Zope3-dev] Re: tagged value handling inconsequent for interface methods and attributes and interfaces themself

Jim Fulton jim at zope.com
Wed Oct 19 10:10:31 EDT 2005


Philipp von Weitershausen wrote:
> Grégoire Weber wrote:
> 
>>while modeling the external API of an application I'd like to use the
>>tagged value feature of the interface implementation.
>>
>>It seems to me that handling tagged values is implemented inconsequently.
>>
>>It would be nice if tagging attributes and interfaces would look the
>>same as tagging methods:
>>
>>in the interface definition:
>>
>>    meth.tag = 'tagged' # interrestingly ``meth.setTaggedValue`` doesn't work
> 
> 
> This is, for example, useful for setting the precondition on __setitem__
> method defintions for containers::
> 
>   class IRecipeContainer(IContainer):
>       def __setitem__(name, object):
>           """Add a recipe"""
>       __setitem__.precondition = ItemTypePrecondition(IRecipe)
> 
> Having to use setTaggedValue would be a lot less syntactic sugar for
> nothing.

It's not for nothing. It's for separation of namespaces.
(Tagged values are a lot like annotations in that respect.)

Of course, the prefered way to express the above now is:

   zope.app.container.contstraints.contains(IRecipe)


> API inconsistencies usually have no specific reasons other than
> bitrotting, I guess.

Yeah, IOW, sounds like a bug.

> I would say that a 'setTaggedValue' method is a bit unpythonic (it
> actually feels quite Javaish).

This is a very old api, going way back before z3.


 > I realize that the concept of tagged
> values is well known from UML, that doesn't mean we can use pythonic
> idioms for it though. I personally would prefer using the
> __getitem__/__setitem__ protocol for this, but interfaces unfortunately
> already use this for accessing interface members (e.g. IRecipe['name']).
> I wish they would use the __getattr__ protocol (e.g. IRecipe.name).
> Maybe it's not too late to change this, though it would be hard. It
> would also make IInterface really tricky (what would
> IInterface.implementedBy be?).

I don't think there is really a need to change this.  If I was going
to change this, I'd probably use the annotations approach.

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org


More information about the Zope3-dev mailing list