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:
class map:
def __init__(self, func, iterable):
self.func = func
self.iterable = iterable
def __iter__(self):
yield from (self.func(x) for x in self.iterable)
def __len__(self):
return len(self.iterable)
def __getitem__(self, key):
return self.func(self.iterable[key])
Let me know if there any downsides to this that I'm not seeing. From my
perspective, it seems like there would be only a number of (small) advantages:
- Less surprising
- Avoid some unnecessary copies
- Backwards compatible
-Kale
_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/