[Python-3000] have zip() raise exception for sequences of different lengths

Jim Jewett jimjjewett at gmail.com
Thu Aug 31 17:38:59 CEST 2006


On 8/30/06, Barry Warsaw <barry at python.org> wrote:
> On Aug 30, 2006, at 5:57 PM, Guido van Rossum wrote:

> > Perhaps a compromise could be to add a keyword parameter to request
> > such an exception? (We could even add three options: truncate, pad,
> > error, with truncate being the default, and pad being the old map()
> > and filter() behavior.)

> What about a keyword argument called 'filler' which can be an n-sized
> sequence or a callable.

How about a keyword-only argument called finish which is a callable to
deal with the problem?  When any sequence is exhausted, its position
is filled with StopIteration, and then finish(result) is returned.

For example,

    >>> g=zip("abc", (1,2))

The third call to g.next() will return the result of
    finish('c', StopIteration)

def finish_truncate(*args):
    # The default, like today
    raise StopIteration

def finish_error(*args):
    if all(v is StopIteration for v in args):
        raise StopIteration
    raise ValueError("Mismatched sequence length %s" % args)

def finish_padNone(*args):
    if all(v is StopIteration for v in args):
        raise StopIteration
    return tuple((v if v is not StopIteration else None) for v in args)

-jJ


More information about the Python-3000 mailing list