Dieter Maurer wrote:
While trying to understand, what the "bself= self.aq_explicit" in "OFS.DTMLMethod.__call__" should do, I detected an unexpected behaviour:
usually, this "bself" acquires implicitly from its container (though not from its context)
More precisely:
if "bself.aq_self" is itself an implicit acquisition wrapper, the "bself.aq_explicit" acquires implicitly from "bself.aq_self.aq_parent".
The following Python module demonstrates the behaviour:
------------------------------------------------------- from Acquisition import Implicit
class C(Implicit): pass
b= C() b.i= 0 b.d= C() b.h= C()
e_bd= b.d.aq_explicit try: e_bd.i print 'e_bd implicitly acquired i' except AttributeError: pass
e_bhd= b.h.d.aq_explicit try: e_bhd.i print 'e_bhd implicitly acquired i' except AttributeError: pass -------------------------------------------------------
At first, I thought this were a bug. At second thought, however, it appears to be quite natural, though unexpected:
if o is self.__of__(parent), then getattr(o.aq_explicit,k) = getattr(self,k).__of__(o)
If "self" is an implicit wrapper itself, then acquisition may be used to look up "k".
This implies, that the idiom
<dtml-if "_.hasattr(o.aq_explicit,XXXX)">
cannot be used safely to test, whether "o" has attribute XXXX itself (rather than acquired it). We probably should have a standard function for this kind of test.
Mhhh .... Something like "<dtml-if "_.hasattr(o.aq_base,XXXX)">" ? P.-J.
Dieter
_______________________________________________ Zope maillist - Zope@zope.org http://lists.zope.org/mailman/listinfo/zope ** No cross posts or HTML encoding! ** (Related lists - http://lists.zope.org/mailman/listinfo/zope-announce http://lists.zope.org/mailman/listinfo/zope-dev )
-- If the only tool you have is a hammer, you tend to see every problem as a nail. Si le seul outil dont vous disposez est un marteau, vous avez tendance à voir chaque problème comme un clou. --Abraham Maslow