Welcome, guest | Sign In | My Account | Store | Cart

A discussion on python-dev ( http://mail.python.org/pipermail/python-dev/2002-November/030380.html ) came up with the idea of allowing arbitrary assignments::

>>> a,b,*c = (1,2,3,4,5)
>>> a
1
>>> b
2
>>> c
(3, 4, 5)

I didn't like the idea of adding this to the language for assignments, so I came up with a generator that basically does the above but assigns the last variable the used iterator, and all without any new syntax.

Thanks to Alex Martelli for simplifying the code and Oren Tirosh for coming up with better variable names.

Python, 9 lines
1
2
3
4
5
6
7
8
9
def peel(iterable, arg_cnt=1):
    """Use ``iterable`` to return ``arg_cnt`` number of arguments
    plus the iterator itself.

    """
    iterator = iter(iterable)
    for num in xrange(arg_cnt):
        yield iterator.next()
    yield iterator

So now you can do the same as the example mentioned previously as::

>>> a,b,c = peel((1,2,3,4,5), arg_cnt=2)
>>> a
1
>>> b
2
>>> c



>>> for value in c: print value
3
4
5

This of course works for as many arguments as you want; just make sure you set arg_cnt properly and that the iterable can be called that many times.

Created by Brett Cannon on Sun, 24 Nov 2002 (PSF)
Python recipes (4591)
Brett Cannon's recipes (16)

Required Modules

  • (none specified)

Other Information and Tasks