[Zope-dev] C-extension in zope.i18nmessageid
Malthe Borch
mborch at gmail.com
Fri Dec 12 07:45:27 EST 2008
Martijn Pieters wrote:
> The C extension is required to make messageids immutable. Because they
> are immutable, the security machinery can treat them as rocks, e.g.
> safe to pass around. Removing the C-extension undoes this, as you
> cannot make truely immutable.
I believe it is possible to do this in pure Python:
We'll set up a security-proxied global dictionary ``messages`` that maps
object_id of message -> weakref(message)
Then, the ``Message`` class would roughly look like this:
class Message(unicode):
def __new__(...):
self = unicode.__new__(...)
messages = removeSecurityProxy(messages)
messages[id(self)] = (default, domain, mapping)
@property
def default(self):
return messages[id(self)][0]
The message data is effectively immutable, since the ``messages``
dictionary is security-proxied.
To make sure the message properties are persisted along with the
message, we must override the __reduce__-method to maintain the
``messages`` dict upon load.
\malthe
More information about the Zope-Dev
mailing list