The feature is available in Python 3.x:

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

This is a nice feature of 3.x but I'm disappointed (especially in light of the move to make more things iterators/generators), that the first form unpacks and returns a list instead returning the unexhausted generator. There are times I've wanted to write something like

  def powers_of_n(n=2):
    p = 0
    while True:
      yield n ** p
      p += 1

  def linear(i=0, step=1):
    while True:
      yield i
      i += step

  CONST_A, CONST_B, CONST_C, *_ = linear()
  OPT_A, OPT_B, OPT_C, *_ = powers_of_n()

because adding another CONST or OPT becomes trivial (just add it to the list of names). I currently have to do something like

  CONST_A, CONST_B, CONST_C = range(3)

and then remember to bump up my range() parameter when I create a new value on the left. It's not bad to see here, but I often have times where N>60 constants and tweaking something in an alphabetically sorted list may require scrolling to see/remember the range() change.


However, because 3.x tries to make a list out of it, this doesn't help me at all because my generator is infinite. Boo.


Diez Roggisch gave me a beautiful (okay, the implementation code is a bit ugly, but the final product's simplicity achieves elegance) solution to my similar want for 2.x here:

http://www.mail-archive.com/python-list@python.org/msg87022.html

-tkc




--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to