[Tutor] Critique of program

Bill Burns billburns at pennswoods.net
Thu Nov 18 05:03:57 CET 2004


Anna,

Thank you for your help! I appriecate it! I have made some of the changes
that you suggested, please see below:

You wrote:
> Just a few observations:
> >     def clearLineEdits(self):
> >         """Clears the data in every lineEdit
> >         """
> >         for name in self.__dict__:
> >             w = getattr(self, name)
> >             if hasattr(w, "displayText"): # if isinstance(w, QLineEdit):
> >                 w.clear()
> >         self.lineEditTotal.setText("")
>
> You said:
>  > I'm not really trying to check whether the object has a certain
>  > attribute that I desire, I just want to know if it's the object that
>  > I'm looking for. IOW, are you a lineEdit or are you a button, if
>  > you're a button then go away I only like lineEdits  ;-)
>
> Is it *likely* to be a lineEdit? Can you *DO* w.clear() on a button? If
> it's likely to be a lineEdit, and it's only possible to do w.clear() on
> a lineEdit, then you might want to use the "Better to ask forgiveness
> than permission" idiom of a try/except loop. Same with your other uses
> of hasattr.
>
> Something like (pseudocode):
>
> for name in self.__dict__:
> 	w = getattr(self, name)
> 	try w.clear()
> 	except TypeError:
> 		pass
>
> Or something like that... (It's morning and I haven't finished my second
> cup of tea yet...)

I took the pseudocode above and did this:

for name in self.__dict__:
    w = getattr(self, name)
    try:
        w.clear()
    except TypeError:
        pass

Upon executing the revised code, I received the following error:

AttributeError: 'builtin_function_or_method' object has no attribute 'clear'

I changed "except TypeError:" to except AttributeError:" and it worked,
sort of....As it turns out, a QLabel also has a method clear() so not only did
the revised code clear all of the lineEdits, it also cleared all of the labels
on the form as well. It sure gives me a nice clean looking interface :-) As
you had anticipated, as long as no other object had a clear() method, I
would be O.K. So I'll work on this one.

> > def volCalc(ID, length):
> >     """ Calculates the water volume inside of the pipe
> >     """
> >     gal = ((ID*.5)**2)*3.14159265*(12*length)/(230.9429931)
> >     gal = "%0.2f" % gal
> >     return gal
>
> You're going to be adding these things. It's already a float - so, leave
> it as such. Your presentation/reporting functions can deal with
> formatting stuff like the "0.2f"%gal.

I've removed the formatting as you suggested. Now I just take care of it right
before it is displayed in lineEditTotal.

> > def add(args):
> >     """Sums all of the values on the stack
> >     """
> >     sum = 0
> >     for i in args:
> >         i = float(i)
> >         sum = sum + i
> >     sum = str(sum)
> >     return sum
>
> There is a built-in sum as of Python 2.3 which is very fast. You may
> want to try using that instead. Also, same comment here as in volCalc:
> return a float. Your presentation/reporting functions can stringify it
> as necessary.

I had no idea that there was a built-in sum. I completely removed the add()
function all together. Before I was using add() like this:
 
 total = add(stack)

Now I'm using:

  total = sum(stack)

which works like a charm, so I don't even need the add() function at all.

Again, thank you for the help!!

Bill


More information about the Tutor mailing list