On 7/21/06, Raymond Hettinger <[EMAIL PROTECTED]> wrote:
> Since builtin dicts and dict subclasses will already be iterable, the
> mappings in question would be from user-defined classes with lookup
> behavior and but not providing an iterator:
>
> class C:
> '''This could be either a mapping or sequence
> so it would be foolish to wrap it with a SeqIter'''
> def __getitem__(self, k):
> return f(k)
> def __len__(self):
> return L
>
> So, by default, iter(C()) will now raise a TypeError and provide earlier
> detection of an error rather than waiting for a potential KeyError
> during iteration. And even if C was intended to be a sequence,
> list(C()) would raise a TypeError rather than risk a KeyError if C
> turned-out to be a mapping.
>
> Since all of the builtin sequences will already define __iter__, they
> are unaffected by this change. What is left are user-defined sequence
> classes or extensions with __getitem__ but not __iter__. To make those
> iterable, the user would need to either modify the class (if possible)
> or provide a SeqIte- like wrapper:
>
> def SeqIter(s):
> try:
> for i in itertools.count():
> yield s[i]
> except IndexError:
> return
>
> for elem in SeqIter(s): ... # be explicit about looping over a
> generic sequence
>
> L = list(SeqIter(s)) # explicit wrapper to avoid a
> TypeError for generic sequences
>
>
> Does that correctly recap your proposal, its motivitations, and its
> implications?
Yes. Though I would strongly recommend that all user-defined sequences
should provide an explicit __iter__(). It's only a few lines (and of
course often can be done faster using knowledge of the
implementation):
def __iter__(self):
for i in itertools.count():
yield self[i]
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe:
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com