On Mon, Nov 26, 2018 at 10:35 PM Kale Kundert <k...@thekunderts.net> wrote:
I just ran into the following behavior, and found it surprising:
len(map(float, [1,2,3]))
TypeError: object of type 'map' has no len()
I understand that map() could be given an infinite sequence and therefore might
not always have a length. But in this case, it seems like map() should've
known that its length was 3. I also understand that I can just call list() on
the whole thing and get a list, but the nice thing about map() is that it
doesn't copy data, so it's unfortunate to lose that advantage for no particular
reason.
My proposal is to delegate map.__len__() to the underlying iterable.
Similarly, map.__getitem__() could be implemented if the underlying iterable
supports item access:
Excellent proposal, followed by a flood of confused replies,
which I will mostly disregard, since all miss the obvious.
What's being proposed is simple, either:
* len(map(f, x)) == len(x), or
* both raise TypeError
That implies, loosely speaking:
* map(f, Iterable) -> Iterable, and
* map(f, Sequence) -> Sequence
But, *not*:
* map(f, Iterable|Sequence) -> Magic.
So, the map() function becomes a factory, returning an object
with __len__ or without, depending on what it was called with.
/Paul
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/