is parameter an iterable?

Steven D'Aprano steve at REMOVETHIScyber.com.au
Wed Nov 16 05:39:45 EST 2005


On Tue, 15 Nov 2005 21:54:07 -0500, Dan Sommers wrote:

> On Wed, 16 Nov 2005 13:12:38 +1100,
> Steven D'Aprano <steve at REMOVEMEcyber.com.au> wrote:
> 
>> try:
>>      for item in obj:
>>          do_stuff(item)
>> except TypeError, msg:
>>      if msg == "iteration over non-sequence":
>>          handle_non_iterator()
>>      else:
>>          # re-raise the exception
>>          raise
> 
> But what it do_stuff tries to iterate over a non-sequence?

I can think of two solutions:

(1) Write do_stuff carefully, and test it thoroughly on its own. If there
are no bugs in do_stuff, you can be sure it isn't going to try to iterate
over a non-iterator. This is a good argument for writing small,
encapsulated, easily analysed and debugged pieces of code.

(2) Muck about writing fragile, possibly buggy code:

# untested
try:
    for item in obj:
        flag = False
        try:
            do_stuff(item)
        except TypeError, msg:
            if msg == "iteration over non-sequence":
                flag = True
            # re-raise the exception
            raise
except TypeError, msg:
    if flag:
        raise 
    if msg == "iteration over non-sequence":
        handle_non_iterator()
    else:
        raise



I think you can guess where my preference lies.


-- 
Steven.




More information about the Python-list mailing list