string: __iter__()?

M

mrquantum

Hello!

Just for curiosity i'd like to know why strings don't support the
iteration protocoll!? Is there some deeper reason for this?
False

In Python 2.5 it's actually simple to obtain one:
'S'

Thanks for info!

Chris
 
F

Fredrik Lundh

mrquantum said:
Just for curiosity i'd like to know why strings don't support the
iteration protocoll!?

really? iter("SomeString") works just fine for me.

</F>
 
P

Paul Rubin

mrquantum said:
Just for curiosity i'd like to know why strings don't support the
iteration protocoll!? Is there some deeper reason for this?

False

It is a little but odd. But at least in 2.3.4:

Python 2.3.4 (#1, Feb 2 2005, 12:11:53)
[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = iter('hi there')
>>> a
said:
>>> print [x for x in a] ['h', 'i', ' ', 't', 'h', 'e', 'r', 'e']
>>>

So it looks like the iter is still there, but comes from some older
layer of the implementation.
 
M

mrquantum

Am Wed, 04 Oct 2006 12:03:41 +0200 schrieb Fredrik Lundh:
really? iter("SomeString") works just fine for me.

Hmm, right!

But then why doesn't dir('SomeString') show an __iter__ method? Seems to
be implmented differently than with e.g. lists? Know why?
 
P

Peter Otten

mrquantum said:
Am Wed, 04 Oct 2006 12:03:41 +0200 schrieb Fredrik Lundh:
But then why doesn't dir('SomeString') show an __iter__ method? Seems to
be implmented differently than with e.g. lists?

The older pre-__iter__() iteration style relying on __getitem__() still
works:
.... def __getitem__(self, index):
.... return [3,2,1][index]
........ print item
....
3
2
1
Know why?

No idea. Perhaps nobody cared?

Peter
 
M

mrquantum

Am Wed, 04 Oct 2006 11:59:07 +0200 schrieb mrquantum:
Hello!

Just for curiosity i'd like to know why strings don't support the
iteration protocoll!? Is there some deeper reason for this?

Sorry, was to hasty by saying "... don't support the iteration
protocol'! Sure they do, as the iter('SomeString') function or the
construction for c in 'SomeString' show.

It's just not implemented by a __iter__ method of the string in question!
 
M

mrquantum

Am Wed, 04 Oct 2006 12:24:48 +0200 schrieb Peter Otten:
The older pre-__iter__() iteration style relying on __getitem__() still
works:
... def __getitem__(self, index):
... return [3,2,1][index]
...... print item
...
3
2
1

Thanks! I see:
.... def __iter__(self):
.... for i in xrange(3):
.... yield [3,2,1]
....1

Chris
 
M

Michele Simionato

mrquantum said:
Hello!

Just for curiosity i'd like to know why strings don't support the
iteration protocoll!? Is there some deeper reason for this?

False

In Python 2.5 it's actually simple to obtain one:

'S'

Thanks for info!

Chris

Well, I see it as a feature. Typically I want to consider a string as
an atomic object (and
not as a sequence of characters) and I can check hasattr(obj,
'__iter__') to distinguish
(for instance) a list of strings from a single string (typically in
recursive algorithms
working on texts).

Michele Simionato
 
J

John Roth

mrquantum said:
Hello!

Just for curiosity i'd like to know why strings don't support the
iteration protocoll!? Is there some deeper reason for this?

False

In Python 2.5 it's actually simple to obtain one:

'S'

Thanks for info!

Chris

The iter() builtin creates an iterator for any
object that obeys the sequence protocol.
Since strings obey the sequence protocol there
is no real advantage to adding yet another
protocol to an already very fat object.

This does, however, mean that testing
for the presence of __iter__ is incomplete;
one also has to test for __getattr__ if the
object doesn't have an __Iter__ method.

Depending on your program logic, it
may be easier to just use iter() and
handle the exception if it fails.

See PEP 234 for a discussion of the
reasons for doing it this way.

John Roth
 
M

mrquantum

John Roth:
The iter() builtin creates an iterator for any
object that obeys the sequence protocol.
Since strings obey the sequence protocol there
is no real advantage to adding yet another
protocol to an already very fat object.
Okay!

This does, however, mean that testing
for the presence of __iter__ is incomplete;
one also has to test for __getattr__ if the
object doesn't have an __Iter__ method.

Should be __getitem__ and not __getattr__!?
Depending on your program logic, it
may be easier to just use iter() and
handle the exception if it fails.

Okay, I'll do it this way - except will then raise a TypeError, as I just
found in the docs!
See PEP 234 for a discussion of the
reasons for doing it this way.

Thanks for pointing this out!

Chris

PS: Thanks to all posters in this thread for your illuminative comments!
 
T

Terry Reedy

mrquantum said:
Sorry, was to hasty by saying "... don't support the iteration
protocol'! Sure they do, as the iter('SomeString') function or the
construction for c in 'SomeString' show.

It's just not implemented by a __iter__ method of the string in question!

I am sure this will change in 3.0 and possibly 2.x.
I believe the intention is that 'is iterable' will become the same as 'has
__iter__()'.

tjr
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top