[Zope-dev] __getattr__ and Acquisition

Andreas Kostyrka andreas@kostyrka.priv.at
23 Sep 2002 10:14:49 +0200


Am Mon, 2002-09-23 um 00.18 schrieb Lennart Regebro:
> From: "Andreas Kostyrka" <andreas@kostyrka.priv.at>
> > I've just discovered, that Acquisition does not work with __getattr__,
> > right?
> 
> That depends on what you mean with "does not work". :-)
> 
> > (I assume that this is so because something like getattr(mybase,attr) is
> > called during the acquisition process to prevent infinite recursion.)
> > 
> > Anyway to get around that? (To basically get a wrapped self from
> > somewhere?)
> 
> That's what self usually is... :-)
Nope it is not. In a normal method you can access something acquired
like this:
self.acquired_value.
Even more, this works for __bobo_traverse__. It just works for the
publishing not accessing my attributes later on during publication.

The problem is, that __getattr__ does not have access to the acquisition
chain. Now I storing the "acquisition chain" in the object is not a
sound proposition, because it is not thread safe. Worse the object might
be accessed in some way that makes the acquisition chain not be updated.


> 
> I think you need to answer a couple of questions:
> 1. What is it you want to do?
> 2. How are you trying to do it?
> 3. What is happening when you try to do it?
It's actually trivial ;)
I want to acquire some things in __getattr__.
Basically I want to insert an additional access step like this:
1.) a.b.c.o -> o if o exists in c
2.) a.b.c.o -> Folder.o (where Folder is acquired from a.b.c) if it's 
               exist.
3.) a.b.c.o -> tries to acquire o from a.b.c.

Basically I want "Transparent Folders" which get their "transparent
values from the Acquisition path.

Well, I just had an idea for an implementation:
Third idea: I return some callable object the was generated specifically
for the access from the __getattr__. This is than executed with
Acquisition enabled, so it can try to get the real one, ....
Problem: What if the attribute does not exist? I do not thing that Zope
reacts to well when instead of a AttributeError exception it gets some
object that raises AttributeError when accessed, ....

Andreas