[Tutor] recursive problem

Steven D'Aprano steve at pearwood.info
Sat Sep 11 20:18:22 CEST 2010


On Sun, 12 Sep 2010 04:01:39 am Walter Prins wrote:

> I guess the question to ask/consider is: How can be establish whether
> a particular object supports a particular interface/set of behaviours
> that we require?  E.g. how do we most pythonically check whether some
> object "walks like a list" and "quacks like a list" without tying
> such code to explicit type checking?

isinstance(object, base_class) becomes even more useful in Python 2.6 
and beyond, because when you create a class, you can register it as a 
list even if you didn't inherit from list. You're essentially 
promising "this class will walk and quack and swim like a list".

But often you don't care that something walks, quacks, and swims like a 
list. You might only care that it walks. We can combine "Look Before 
You Leap" with duck-typing:


def swap_items(sequence):
    try:
        sequence[0] = sequence[0]
    except Exception:
        print("does not support item lookup or item assignment")
    else:
        for i in range(0, len(sequence)-1, 2):
            sequence[i], sequence[i+1] = sequence[i+1], sequence[i]
        return sequence


>>> swap_items("abcd")
does not support item lookup or item assignment
>>> swap_items(['a', 'b', 'c', 'd', 'e', 'f'])
['b', 'a', 'd', 'c', 'f', 'e']




-- 
Steven D'Aprano


More information about the Tutor mailing list