----- Original Message -----
> From: Mark Lawrence <breamore...@yahoo.co.uk> > To: tutor@python.org > Cc: > Sent: Wednesday, June 18, 2014 9:03 PM > Subject: Re: [Tutor] Tips > > On 18/06/2014 15:25, Albert-Jan Roskam wrote: >> ----- Original Message ----- >>> From: Alan Gauld <alan.ga...@btinternet.com> >>> To: tutor@python.org >>> Cc: >>> Sent: Wednesday, June 18, 2014 11:47 AM >>> Subject: Re: [Tutor] Tips >>> >>> On 18/06/14 01:15, Nanohard wrote: >>>>> On 2014-06-17 13:35, Alan Gauld wrote: >>>>> >>>>>> Don't test types, use the interface >>>>> >>>>> Can you please explain what you mean by this? >>>> >>>> He means use the Python interpreter, by going to your console and > typing >>> "python", or in Windows >>>> it's called 'IDLE'. >>> >>> >>> Nope, I meant what Mark and Danny said. >>> >>> For example don't do this: >>> >>> def add(a,b): >>> if type(a) == int and type(b) == int: >>> return a+b >>> else: >>> raise TypeError >>> >>> Just do this: >>> >>> def add(a,b): >>> return a+b >> >> Given that the concept of Ducktyping has already been mentioned, is there a > reason why you did not mention try-except? >> >> def add(a, b): >> try: >> return a + b >> except TypeError: >> raise >> >> Btw, given that: >>>>> {}.__add__ >> Traceback (most recent call last): File "", line 1, in > AttributeError: 'dict' object has no attribute '__add__' >> >> Why does one only need to use 'except TypeError', not 'except > (TypeError, AttributeError)' in the try-except above? >>>>> {} + 1 >> Traceback (most recent call last): File "", line 1, in TypeError: > unsupported operand type(s) for +: 'dict' and 'int' >> > > What makes you think that you're calling your add function in either > example above? In the first you're not calling anything as you've > missed the brackets. Even if you add (groan :) them, you'll be trying > to call an add method for a dict, not your add function. In the second > example, you're trying to add 1 to an empty dict, again your function > doesn't enter into the equation (double groan :) If I call my add function, then then the return statement would be equivalent to: -... if a={] and b=[1]: a.__add__(b) -... if a={} and b=1: AttributeError, because the class dict does not have an __add__ method. That's why I thought an AttributeError would also have to be caught, just in case the caller is stupid enough to give a dict as the first argument. But indeed (Alan) it was silly of me to just 'raise' and not doing anything else with it. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor