Andreas Kostyrka writes:
I've got a product that inherits from Folder, and creates some magic "content" by overriding __bobo_traverse__.
Now I've got the problem that I cannot access the "magic" items from within a DocumentTemplate like in <dtml-var special>.
The interesting thing is, that I've overloaded __getattr__ and __getitem__, and it seems both are never called. (Actual code snippets at the end)
So I'm wondering how DocumentTemplates (and say Page Templates) access the items and properties?
Andreas
code snippet: def __getattr__(self,k,*args): r=Folder.Folder.__getattr__(self,k,*args) print "__getattr__(%r,%r)==%r" % (self,key,r) This will not work as you expect!
"__getattr__" is only called, when the normal lookup does not succeed. "Folder.__getattr__" is inherited from "Persistent" and will serve only very few attributes. For all others, you will get an "AttributeError", before you print anything. Furthermore, "__getattr__" takes only one (non-self) arguement. Your code above (with this strange "*args" code) will pass two. You will get a "TypeError" before you print anything.
def has_key(self,key): r=Folder.Folder.has_key(self,key)
"Folder" implements the mapping interface only very partially. It does not implement "has_key".
... def __getitem__(self,key): print "__getitem__(%r,%r)" % (self,key) try: return Folder.Folder.__getitem__(self,key) except KeyError: try: return self.__bobo_traverse__(self,None,key) except AttributeError: raise KeyError,key "__getitem__" is only called, when you explicitely use "instance[key]".
Dieter