> Steven Bethard wrote:
>>
>>Right.  str and unicode objects support iteration through the old
>>__getitem__ protocol, not the __iter__ protocol.  If you want to use
>>something as an iterable, just use it and catch the exception:
>>
>>try:
>>     itr = iter(a)
>>except TypeError:
>>     # 'a' is not iterable
>>else:
>>     # 'a' is iterable

Martin Miller broke the order of reading by top-posting:
In either case, you can't tell a string and list apart, which is what
the OP wanted to know, namely how to differentiate the two.

Yes, sorry, I should have marked my post OT. It was an answer to Terry Hancock's post suggesting hasattr(x, '__iter__'), not the OP.


Perhaps the test for an __iter__ attribute *is* the way to go because
you can tell the difference between the two type.

I've seen this done before, e.g.:

try:
    itr = iter(x)
except TypeError:
    # is not iterable
else:
    if hasattr(x, '__iter__'):
        # is other iterable
    else:
        # is str or unicode

I don't like this idea much because it depends on str and unicode _not_ having a particular function. I haven't seen any guarantee anywhere that str or unicode won't ever grow an __iter__ method. So this code seems dangerous as far as future compatibility goes.

I think the technique suggested by Robin Munn nearly a year ago (and
referenced by the link in Simon Brunning's post):
http://groups-beta.google.com/group/comp.lang.python/msg/c8befd4bed517bbc
namely:

try:
    a + ''
except TypeError:
    pass
else:
    a= [a]

would be a good usable solution, although it's not totally infallible.

Yup, if I had to do this kind of type-checking (which I don't think I ever do), I'd probably go with something along these lines.


STeVe
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to