[Zope-CMF] Re: "_v_skindata" fix

Dieter Maurer dieter at handshake.de
Thu Feb 24 15:04:40 EST 2005


Florent Guillaume wrote at 2005-2-23 12:54 +0100:
>Dieter Maurer wrote:
> ...
>> Meanwhile, I may have noticed a problem:
>> 
>>   When my memory is right, then it does not work for nested
>>   "Skinnable"s. Because the information is stored
>>   in a global structure keyed by thread id only.

> ...
>I agree but I'm not sure I know a way to fix this. From __getattr__ 
>there is very little that's accessible, and nothing about self's context 
>wrappers.
>
>Hm maybe we could store the portal's full path in a persistent 
>attribute? And update it after add/clone ?

"Full path" or any other kind of unique identifier.


An alternative would be to return a proxy by "__getattr__"
that defers the lookup until sufficient acquisition
context is available. Would look somehow like:

      def __getattr__(self,key):
          return _AQDelay(self, key)

      ...
      class _AQDelay(Implicit):
          def __init__(self, *args):
	      self.args = args

	  def __of__(self, parent):
	      if not hasattr(parent, 'aq_base'):
		 # not yet wrapped sufficiently
		 return self
	      object, key = self.args
              fully_wrapped = object.__of__(parent)
	      # now perform the lookup

It does not work for method lookup (as they do not get
the correct acquisition context).


I do not advocate for this alternative.
It is too complex and magical...


-- 
Dieter


More information about the Zope-CMF mailing list