Am 18.07.2002, 21:54 Uhr schrub Dieter Maurer <dieter@handshake.de>:
objects=Results.Results(result,brain,parent,None)
Now whatever I try, either some other __getattr__ seems to be called since I can get none of my "simulated" attributes to show up. It should work with modern Zope versions.
I once tried and failed with an older version (Zope 2.1.6). My "__getattr__" led to an infinite loop.
I'm using 2.5.1 with python 2.1.3. AFAIK this is fairly recent. So either I'm making a some tragically stupid mistake or something really strange is going on... Let me elaborate a bit (sorry for what follows, it's rather longish): The standard procedure for simulating class attributes in Python I normally use is (set discussions of efficiency aside for a moment): class a: def __init__(self): self.realattrib_a="this is real" def __getattr__(self,key): if key in self.__dict__.keys(): return self.__dict__[key] else: return "simulated attribute" where "realattrib_a" is the only genuine attribute of class a and everything else should have a value of "simulated attribute" This - of course - works perfectly when called with Python from the command line. Now I take this definition and use it as my brain-class. In my parent class (which is a CMF class derived from PortalContent and DefaultDublinCoreImpl and essentially represents an arbitrary list of results of a RDBMS-Query) I do the following: def calculate_results(self,selectionparams): <some logic to construct a query string from params> result=query_the_database(query_string) objects=Results.Results(result,a,self,None) return objects Next I have a DTML-Method that essentially contains: <dtml-let result="calculate_results(selectionparams)"> <dtml-if expr="result"> <dtml-with expr="result[0]"> <dtml-var expr="realattrib_a"> <dtml-var expr="doesntexist_b"> </dtml-with> </dtml-if> </dtml-let> And to my astonishment this already barfs on '<dtml-with expr="result[0]">' with a traceback telling me that the __init__ of class a is flawed since there is no attribute "realattrib_a". ??? How can an __init__-method complain about nonexisting attributes when all I'm trying to do is define some? Ok, I tell myself, if Zope wants me to live without sensible __init__-methods on brain-classes, I can cope with that. I completely remove the __init__-method and the next traceback I get is: File /usr/lib/zope/lib/python/DocumentTemplate/DT_With.py, line 76, in render (Object: result[0]) File /usr/lib/zope/lib/python/DocumentTemplate/DT_Util.py, line 169, in eval (Object: realattrib_a) (Info: realattrib_a) File <string>, line 2, in f NameError: global name 'realattrib_a' is not defined I really don't know what to try next. I know there has to be a really simple solution to this problem, since it is such a simple thing to come up with. But I have to admit, I'm completely lost. No ideas left to try, no hope, no sunshine... Perhaps I just didn't follow standard procedures for this situation, but then I'm guilty of not having tried the appropriate search term with zope.org or google. I'm stumped. Jo. -- Internetmanufaktur Jo Meder ---------------------- Berlin, Germany http://www.meder.de/ ------------------- fon: ++49-30-417 17 63 33 Kollwitzstr. 75 ------------------------ fax: ++49-30-417 17 63 45 10435 Berlin --------------------------- mob: ++49-170- 2 98 89 97 Public GnuPG-Key ---------- http://www.meder.de/keys/jo-pubkey.txt