Thanks a lot for comments! I am going to fix the source according to your advices ;)
Nep On Aug 26, 6:32 pm, Steven D'Aprano <[EMAIL PROTECTED] THIScybersource.com.au> wrote: > On Sun, 26 Aug 2007 15:56:08 +0000, neptundancer wrote: > > Hi, > > to extend my skills, I am learning python. I have written small > > program which computes math expression like "1+2*sin(y^10)/cos(x*y)" and > > similar, so far only + - * / ^ sin con tan sqrt are supported. But my > > program is quite inextensible, I have to change the code to add new > > functions... Could some fellow experienced pythonista give me some tips > > how to make my program shorter, and more extensible? > > Just a few comments at random. This is certainly not meant to be > exhaustive: > > > def normalize(string): > > tmp = "".join([c for c in string if c != " "]) > > return "(" + tmp + ")" > > Try this instead: > > def normalize(astring): > return "(" + astring.replace(" ", "") + ")" > > > > > def most_nested_expression(string): > [snip code] > > if level != 0: > > raise IOError("mismatched parens") > > You raise IOError quite often, but that's a misuse of it. IOError is a > subclass of EnvironmentError, and is meant to indicate (e.g.) a failed > read from a disk. > > If you execute help(IOError) at the interactive prompt, you will see: > > class IOError(EnvironmentError) > | I/O operation failed. > > I suggest a better exception to use would be ValueError, or even create > your own: > > class MyCustomError(ValueError): > pass > > would be a minimal example. > > > def is_reduced_expression(string): > > for c in string: > > if c == "^" or c == "*" or c == "/" or c == "+" or c == "-": > > return False > > return True > > Change that to: > > for c in string: > if c in "^*/+-": return False > return True > > [snip] > > > def add(a, b): return a + b > > def sub(a, b): return a - b > > def mul(a, b): return a * b > > def div(a, b): return a / b > > Replace the above four functions with: > > from operator import add, sub, mul > from operator import truediv as div > > > def translate_function(fn_str): > > if fn_str == "+": return add > > elif fn_str == "-": return sub > > elif fn_str == "*": return mul > > elif fn_str == "/": return div > > elif fn_str == "^": return math.pow > > elif fn_str == "sin": return math.sin elif fn_str == "cos": return > > math.cos elif fn_str == "tan": return math.tan elif fn_str == > > "sqrt": return math.sqrt else: raise IOError("unknown function %s" % > > fn_str) > > fn_map = {"+": add, "-": sub, "*": mul, "/": div, > "^": math.pow, "sin": math.sin } # etc. > > def translate_function(fn_str): > try: > return fn_map[fn_str] > except KeyError: > raise ValueError("unknown function '%s'" % fn_str) > > Hope that helps. > > -- > Steven. -- http://mail.python.org/mailman/listinfo/python-list