Vincenzo Di Somma writes:
in our zope product (a folderish class) we want to call one of its contained methods (like a dtml-method, for example). We also want to decide which method (of all dtml-methods contained in the folderish item) at run-time... We tried using eval('self.' + method_name) and it works... The problem is it can't refer any other object in the same folder (more in general it can't traverse the zope tree)... what can we do? When you want to traverse, use "restrictedTraverse"....
An example: in our "ff" folderish item there is a "mh" mailhost item and a "dm" dtml-method. We call "dm" from one of our "ff" methods (say "ff.mm") using eval("self.dm"). The result is that "dm" is correctly called but it won't find its "mh" mailhost (needed to send the mail). Seems to be different problem: context not passed... A standard error with DTML objects....
1) Our code:
class ourclass (Folder)
def ourmethod(self, ...): method_name=... #will be "dm" at run-time parameters=... #parameters for "dm" eval("self." + method_name)(parameters=parameters) Use:
getattr(self,method_name)(self,self.REQUEST,parameters=parameters) The replacement of "eval" by "getattr" is not essential. The extra positional arguments are! Dieter