Steven D'Aprano wrote: > Sakcee wrote: > >> python provides a great way of dynamically creating fuctions calls and >> class names from string >> (snip)
> Personally, I think the best way is: find another way to solve your > problem. > See Duncan's post for a pretty clean and pythonic solution. Another one that may be more explicit and avoid messing with locals() or globals() is: >> is it correct way, is there a simple way, is this techniqe has a name? > > > I'm told that some people call this "dynamic programming", In some other languages, it could be called 'metaprogramming', but this is such a common idiom in Python that I'd just call this "programming" !-) > but > personally I call it "difficult to maintain, difficult to debug > programming". Oh yes ? Why so ? I've used such patterns hundreds of time, and it has never been a problem so far. Dynamically selecting the function to call given a name (as string) is is a well-known programming pattern. I learned this in C, using a hashtable to store names/function pointer pairs. And that's mostly what the proposed solutions (the one based on globals() or locals() as well as Duncan's class-based one) do - the main difference being that Python offers the hashtable for free !-) nb : I agree that the use of the global or local namespaces may not be the best thing to do - better to use (any variant of) Duncan's solution IMHO. > (Before people get all cranky at me, I'm aware that it isn't *always* > the Wrong Way to solve problems, but it is a technique which is subject > to abuse and can often be avoided by using function objects instead of > function names.) When you get the function name as user input, you cannot directly access the function object. And anyway, what do you think Python do when you call a function ? Python namespaces *are* hash tables mapping symbols names (as string) to objects (as pointers). I don't see much difference here. (nb 2 : I agree that it is of course better to avoid 'manual' namespace lookup whenever possible) -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list