Make message ids into "rocks", was Re: [Zope3-dev] Re: SVN: Zope3/trunk/src/zope/ Internationalized apidoc modules description.

Dmitry Vasiliev lists at hlabs.spb.ru
Fri Sep 3 14:22:45 EDT 2004


Jim Fulton wrote:
> Dmitry Vasiliev wrote:
> 
>> Philipp von Weitershausen wrote:
>>
>>> Jim Fulton wrote:
>>>
>>>>  > Since this problem occurred only as you internationalized API doc,
>>>>
>>>>> we should be able to quickly determine the place where we should 
>>>>> call the removeSecurityProxy() call.
>>>>
>>>>
>>>>
>>>> A better aproach is to add necessary security declarations for 
>>>> message ids.
>>>>
>>>> It would be nice if we could make message ids into "rocks" so they 
>>>> didn't
>>>> have to be proxied.  We would have to make them immutable though, and
>>>> be careful about the data they contained.
>>>
>>>
>>>
>>>
>>> I would like them to be rocks, too. Their semantics right now are a 
>>> bit problematic for this, though. Consider a message id:
>>>
>>>   >>> from zope.i18nmessageid import MessageIDFactory
>>>   >>> _ = MessageIDFactory('zope')
>>>   >>> msg = _(u"foo-label", u"Foo")
>>>   >>> msg
>>>   u'foo-label'
>>>   >>> msg.default
>>>   u'Foo'
>>>   >>> msg.mapping
>>>   {}
>>>
>>> Since the attributes are writable, message ids are mutable:
>>>
>>>   >>> msg.default = u"Foo bar"
>>>   >>> msg.mapping = {'foo':'bar'}
>>>
>>> or
>>>
>>>   >>> msg.mapping.update({'foo':'bar'})
>>>
>>> I would suggest to
>>>
>>> 1.) make the 'default' attribute a read-only attribute. 'default' and 
>>> message-id are to be seen as one set of information, always tied 
>>> together.
>>
>>
>>
>> The 'domain' attribute should be a read-only attribute too.
> 
> 
> Yup. All of the attributes must be read only.
> 
>>> 2.) use a different syntax for updating the mapping:
>>>
>>>   >>> msg = msg % {'foo':'bar'}
>>>
>>> Note how the __mod__ (method responsible for the % operator) returns 
>>> a new message id object.
>>>
>>> This is an analogy to
>>>
>>>   >>> "Insert %(text)s" % {'text': 'here'}
>>>   Insert here
>>
>> Maybe the 'mapping' attribute should be a read-only attribute which 
>> returns the mapping copy?
> 
> But that doesn't prevent the mapping from being changed in the
> message id. We need to prevent the messaage id's data from being
> mutated.

I told about following code:

     mapping = property(lambda self: self.__mapping.copy())

So the mapping may be changed only using the % operator, like Philipp 
suggested.

> I suggest we use Python dict proxies, which are proxies
> used by new-style classes to prevent modification of their
> dictionaries.  Unfortunately, creation of these is not
> exposed to Python code. Someone will have to whip up a small
> C extension to make these creatable from Python.  I've proposed
> on python-dev to make these creatable from Python, but that wouldn't
> happen until Python 2.4 at the soonest.

I don't think it's necessary, Philipp already post the pure Python 
implementation.

-- 
Dmitry Vasiliev (dima at hlabs.spb.ru)
     http://hlabs.spb.ru


More information about the Zope3-dev mailing list