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