Currently the common pattern for yielding the elements in a sequence is as 
follows:

  for x in sequence: yield x

I propose the following replacement (the result would be identical):

  yield *sequence

The semantics are somewhat different from argument expansion (from which the 
syntax is borrowed), but intuitive: yield all of the elements of a sequence (as 
opposed to yield the sequence as a single item). This doesn't appear to have 
any syntactical collisions, as it is currently a syntax error.

Motivation: More compact notation, and the compiler can produce more efficient 
bytecode than the former representation (the loop overhead is omitted). This 
pattern is very common in recursive generators, so a compact notation would be 
nice.

Also, there is precedent: the proposed notation is implemented in javascript 
with identical semantics (though in javascript, the conventional spacing is 
different: yield* sequence ).

Examples:
  yield *(1,2,3)
... instead of :
  yield 1; yield 2; yield 3
... or:
  for x in (1,2,3): yield x


  yield *chain(seq1, seq2)
... instead of :
  for x in chain(seq1, seq2) yield x

~ Ken Seehart

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

Reply via email to