duck-type-checking?

Terry Reedy tjreedy at udel.edu
Wed Nov 12 13:32:35 EST 2008


Joe Strout wrote:
> Let me preface this by saying that I think I "get" the concept of 
> duck-typing.
> 
> However, I still want to sprinkle my code with assertions that, for 
> example, my parameters are what they're supposed to be -- too often I 
> mistakenly pass in something I didn't intend, and when that happens, I 
> want the code to fail as early as possible, so I have the shortest 
> possible path to track down the real bug.  Also, a sufficiently clever 
> IDE could use my assertions to know the type of my identifiers, and so 
> support me better with autocompletion and method tips.
> 
> So I need functions to assert that a given identifier quacks like a 
> string, or a number, or a sequence, or a mutable sequence, or a certain 
> class, or so on.  (On the class check: I know about isinstance, but 
> that's contrary to duck-typing -- what I would want that check to do 
> instead is verify that whatever object I have, it has the same public 
> (non-underscore) methods as the class I'm claiming.)
> 
> Are there any standard methods or idioms for doing that?

Test for one on more of the methods that the parameter must have in that 
function, that constitute 'quacking like a duck'

 >>> ob = [1,2,3]
 >>> assert ob.__getitem__ and ob.__setitem__
 >>> ob = 3
 >>> assert ob.__getitem__ and ob.__setitem__
Traceback (most recent call last):
   File "<pyshell#5>", line 1, in <module>
     assert ob.__getitem__ and ob.__setitem__
AttributeError: 'int' object has no attribute '__getitem__'

Focus on testing ones that differentiate the species you want.  Lists 
have __add__ and __mul__ but do not have

 >>> assert ob.__sub__ and ob.__floordiv__

Since methods are always True, no need for hasattr().

Terry Jan Reedy





More information about the Python-list mailing list