On 18/06/2014 20:17, Albert-Jan Roskam wrote:


----- 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.


Now you've completely lost me. Please explain precisely what you think your function does, and how it relates to the two examples that you tried that gave exceptions.

--
My fellow Pythonistas, ask not what our language can do for you, ask what you can do for our language.

Mark Lawrence

---
This email is free from viruses and malware because avast! Antivirus protection 
is active.
http://www.avast.com


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to