"Steven D'Aprano" <st...@remove-this-cybersource.com.au> wrote in message news:0182896d$0$8693$c3e8...@news.astraweb.com...
On Sun, 18 Jan 2009 11:11:45 +1000, elhombre wrote:

Hello, below is my first fragment of working python code. As you can see
it is very java like as that is all I know. Is this the right approach
to be taking?

You might find it very useful to read:

http://dirtsimple.org/2004/12/python-is-not-java.html

http://dirtsimple.org/2004/12/java-is-not-python-either.html



Should I be taking a different approach? Thanks in advance.

This is obviously a very minimal program, so I won't criticise you for
failing to do any error checking :-) However, I will make some broad
points:

* No getters and setters. Python takes a very permissive approach to
class attributes, taking the philosophy "we're all adults here". It's
easy to change a public attribute to a private attribute with a getter/
setter if you need to, so there's nothing to be gained by writing getters
for straight attribute access. It just makes things slow.

* Don't return error values, raise an exception. Setting up a
try...except block is really fast in Python, almost as fast as a pass
statement (according to my tests). Catching the exception itself is slow,
but most of the time you won't care about that.



Let me re-write your code in a more Pythonic way. This is not the only
way to do this, and it probably isn't the best way, but it may give you a
flavour for the way Python is usually written.


import sys
import operator

class Calculator():
   dispatch = {  # dispatch table mapping symbol to function
       '+': operator.add,
       '-': operator.sub,
       '*': operator.mul,
       '/': operator.truediv,
       }
   def __init__(self):
       self.operator = sys.argv[1]
       self.arg1 = int(sys.argv[2])
       self.arg2 = int(sys.argv[3])
   def calculate(self):
       func = self.dispatch[self.operator]
       return func(self.arg1, self.arg2)


if __name__ == '__main__':
   # run this block only when running as a script, not
   # when the module is being imported (say, for testing).
   x = Calculator('+', 23, 42)
   try:
       y = x.calculate()
   except KeyError:
       print "Unrecognised operator '%s'" % x.operator
   else:
       print y




--
Steven

Excellent links. Thanks Steven !
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to