On Tue, Mar 27, 2012 at 16:35, Hanno Schlichting <hanno@hannosch.eu> wrote:
On Tue, Mar 27, 2012 at 3:50 PM, Patrick Gerken <do3ccqrv@googlemail.com> wrote:
Hmm, since I didn't understand what magic happens with __parent__ pointers, I tried the following in pdb: unwrapped = aq_base(a) unwrapped.__parent__ = aq_base(a.__parent__)
So I stored a not acquisition wrapped object onto the __parent__ attr of another unwrapped object. But then the result, unwrapped.__parent__ was acquisition wrapped again!
Yep. That's one thing we changed in Acquisition and ExtensionClass 4.0a1: Prevent wrappers to be created while accessing __parent__ on types derived from Explicit or Implicit base classes.
Usually accessing any attribute on a type derived from Acquisition.Explicit or Implicit will force wrapping to take place, unless there's already a wrapper present. Maybe you remember the whole weird story with browser views in Zope 2 and the need for using "context = aq_inner(self.context)". That was the same problem. Accessing the context attribute of the view (self), created a wrapper equivalent to: "context = context.__of__(self)", as the view itself wasn't wrapped in anything. For views we got rid of the problem by removing the Acquisition.Implicit base class.
I do remember that. Never understood why. Thanks for the detailed explanation of all this. Best regards, Patrick