
On Fri, Jan 08, 2021 at 11:19:40PM +0200, Ram Rachum wrote:
Today I had a need: I had a tuple of dynamic sequence-like objects. I wanted to iterate on them reversed, starting with items of the last one and slowly making my way towards the first one.
In short, I want `reversed(itertools.chain(x, y, z))` that behaves like `itertools.chain(map(reversed, (z, y, x)))`.
That would break backwards compatibility, because `reversed(itertools.chain(x, y, z))` is already possible today, and it does *not* behave in that fashion. reversed reverses whatever iterable it is given, it doesn't single out chain objects for special magical handling. If I write this: reversed([None, 'abc', 'def', 'ghi']) I expect to get 'ghi', 'def', 'abc', None and not 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a', raise TypeError If I replace the list with itertools.chain, I should still get exactly the same results, and I do. Breaking backwards compatibility for your special case is not going to happen.
What do you think?
I think you should just write `itertools.chain(map(reversed, (z, y, x)))`. If you don't have the individual x, y, z sequences, but only their tuple t = (x, y, z), you have two choices: itertools.chain(map(reversed, t[::-1])) itertools.chain(map(reversed, reversed(t))) They have slightly different meanings, so you get to choose whichever one suits your use-case better. Not every trivial combination of functions needs to be given a built-in or standard library solution. Especially not if doing so will break backwards compatibility. "I had three numbers in a tuple, and wanted half of twice the first number added to the difference of the remaining two. What do you think about making `len((a,b,c))` return `(2*a + abs(b - c))/2`?" *wink* -- Steve