On Sun, Oct 16, 2016 at 9:06 PM, Nick Coghlan firstname.lastname@example.org wrote:
Remember that what we're arguing about is that existing instances of:
[x for subiterable in iterable for x in subiterable]
[...] would be easier to read and maintain if they were instead written as:
[*subiter for subiter in iterable]
That's the bar people have to reach - if we're going to add a 3rd spelling for something that already has two spellings
The only proposal in this thread that has come close to reaching that bar is David Mertz's proposal to reify single level flattening as a flatten() builtin:
[x for x in flatten(iterable)]
I don't think I'd actually propose a builtin for this. For me, including the recipe that is in the itertools documentation into a function in the module would be plenty. Writing "from itertools import flatten" is not hard.
Then the only thing that folks need to learn is that Python's builtin "flatten()" is a *non-recursive* operation that consistently flattens one layer of iterables with no special casing (not even of strings or bytes-like objects).
Actually, I think that if we added `flatten()` to itertools, I'd like a more complex implementation that had a signature like:
def flatten(it, levels=1): # Not sure the best implementation for clever use of other itertools ...
I'm not quite sure how one would specify "flatten all the way down." In practice, `sys.maxsize` is surely large enough; but semantically it feels weird to use an arbitrary large number to mean "infinitely if necessary."