> Kind and wise fellows, > > I've got a web application with the following structure: > > 1) module of 100 functions corresponding to user actions (e.g. > "update_profile()", "organisations_list()") > 2) a wsgi callable which maps urls to functions eg > /organisations/list/?sort=date_created is mapped to > organisations_list("dateCreated") > 3) mapping is performed using inspect.getargspec() > 4) a bunch of html generating templates > > In the templates I want to generate urls by referencing the function to > which they map, rather than the url, e.g. > > <a href="${organisations_list('dateCreated'})'">Sort By Date Created</a> > > In other words, I want to always refer to functions, rather than mixing > up function calls and urls > > I would like a class that proxies all the 100 functions in the user > actions module. When a proxied function is called via this class it > should return the url to which it is mapped rather than executing the > user action function. > > <a href="${proxyclass.organisations_list('dateCreated')}">Sort By Date > Created</a> > > should produce: > > <a href="/organisations/list/?sort=date_created">Sort By Date Created</a> > > Obviously, I don't want to write and maintain copies of these 100 > functions in another class. > > My question is therefore: what is the best way to proxy these 100 functions? > > Thanks > First off, don't attempt to start a new thread by replying to a previous one. Many newsreaders will merge the two, confusing the hell out of everyone and generally not helping.
Second, what makes you think you need a module? I'd have thought an instance of some user-defined class would have been better, as that way you can redefine the __getattr__() method to return appropriate functions. This seems to work, though I haven't tested it extensively (i.e. I have called one instance precisely once ;-) >>> import re >>> pat = re.compile("([a-z]+)(.+)") >>> class myRewriter: ... def srt(self, s): ... m = pat.match(s) ... if not m: raise ValueError(s) ... return m.group(1), m.group(2).lower() ... def __getattr__(self, name): ... n1, n2 = name.split("_") ... def f(val): ... s1, s2 = self.srt(val) ... return "/%s/%s/?sort=%s_%s" % \ ... (n1, n2, s1, s2) ... return f ... >>> r = myRewriter() >>> r.organisations_list('dateCreated') '/organisations/list/?sort=date_created' >>> regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden ------------------ Asciimercial --------------------- Get on the web: Blog, lens and tag your way to fame!! holdenweb.blogspot.com squidoo.com/pythonology tagged items: del.icio.us/steve.holden/python All these services currently offer free registration! -------------- Thank You for Reading ---------------- -- http://mail.python.org/mailman/listinfo/python-list