[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