On 7/8/07, Guido van Rossum <[EMAIL PROTECTED]> wrote:

Ahem. I hope you have a better use case for getitem() than that
(regardless of the default issue). I find it clearer to write that as

try:
  compid = root[ns.company_id].next()
except StopIteration:
  compid = None
else:
  compid = int(compid)

While this is more lines, it doesn't require one to know about
getitem() on an iterator. This is the same reason why setdefault() was
a mistake -- it's too obscure to invent a compact spelling for it
since the compact spelling has to be learned or looked up.



Apropos of this discussion, I've occasionally wanted a faster version of the
following:

_nothing=object()

def nth_next(seq,n,default=_nothing):
 '''
 Return the n'th next element for seq, if it exists.

 If default is specified, it is return when the sequence is too short.
 Otherwise StopIteration is raised.
 '''
 try:
   for i in xrange(n-1):
     seq.next()
   return seq.next()
 except StopIteration:
   if default is _nothing:
     raise
   return default

The nice thing about this function is that it solves several problems in
one: extraction of the n'th next element, testing for a minimum sequence
length given a sentinel value, and just skipping n elements.  It also leaves
the sequence in a useful and predictable state, which is not true of the
Python-version getitem code.  While cute, I can't say if it is worthy of
being an itertool function.

Also vaguely apropos:

def ilen(seq):
 'Return the length of the hopefully finite sequence'
 n = 0
 for x in seq:
   n += 1
 return n

Why?  Because I find myself implementing it in virtually every project.
Maybe I'm just an outlier, but many algorithms I implement need to consume
iterators (for side-effects, obviously) and it is sometimes nice to know
exactly how many elements were consumed.

~Kevin
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to