Make filter() and map() return function if iterable is not passed
One of my students gave me an interesting question about why `filter` and `map` do not return a reusable function in case the iterable is not passed. With the current design ``` In [1]: a = filter(lambda x: x > 60) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-ad0178d4fce0> in <module> ----> 1 a = filter(lambda x: x > 60) TypeError: filter expected 2 arguments, got 1 ``` this is fine as long as you need to use that filter for once. But if you want to reuse it you either need to create the iterator every time specifying the filter function, or save the function in a var and create the filter with that. I'm wondering why can't we create custom filters and mappers that are reusable. The result will look something like this: ```
pass_filter = filter(lambda x: x > 60) foo = [42, 56, 67, 87] for i in pass_filter(foo): print(i) 67 86 bar = {45, 94, 65, 3} for i in pass_filter(bar): print(i) 65 94
Are there any drawbacks or limitations to this? Is is worth working on?
I think one function returning multiple types must be confusing. You should use `functools.partial` or create new function with def or lambda.
from functools import partial
pass_filter = partial(filter, lambda x: x > 60) foo = [42, 56, 67, 87] for i in pass_filter(foo): print(i)
# 67 # 87
2021/02/11 23:04、Henry Harutyunyan <henryharutyunyan@gmail.com>のメール:
One of my students gave me an interesting question about why `filter` and `map` do not return a reusable function in case the iterable is not passed.
With the current design ``` In [1]: a = filter(lambda x: x > 60) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-ad0178d4fce0> in <module> ----> 1 a = filter(lambda x: x > 60)
TypeError: filter expected 2 arguments, got 1 ```
this is fine as long as you need to use that filter for once. But if you want to reuse it you either need to create the iterator every time specifying the filter function, or save the function in a var and create the filter with that.
I'm wondering why can't we create custom filters and mappers that are reusable. The result will look something like this:
```
pass_filter = filter(lambda x: x > 60) foo = [42, 56, 67, 87] for i in pass_filter(foo): print(i) 67 86 bar = {45, 94, 65, 3} for i in pass_filter(bar): print(i) 65 94
Are there any drawbacks or limitations to this? Is is worth working on? _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/IDSPO3VQWDANWON4LAEGZPNI4MDAZZBH/ Code of Conduct: http://python.org/psf/codeofconduct/
On Fri, Feb 12, 2021 at 1:01 AM Henry Harutyunyan <henryharutyunyan@gmail.com> wrote:
this is fine as long as you need to use that filter for once. But if you want to reuse it you either need to create the iterator every time specifying the filter function, or save the function in a var and create the filter with that.
I'm wondering why can't we create custom filters and mappers that are reusable. The result will look something like this:
```
pass_filter = filter(lambda x: x > 60) foo = [42, 56, 67, 87] for i in pass_filter(foo): print(i) 67 86 bar = {45, 94, 65, 3} for i in pass_filter(bar): print(i) 65 94
Are there any drawbacks or limitations to this? Is is worth working on?
Why not simply define your function and give it a name? def above_sixty(x): return x > 60 That'd give you most of the same benefits. Making filter/map do something completely different if you omit an argument is a bug magnet. ChrisA
participants (3)
-
Chris Angelico
-
Henry Harutyunyan
-
永田大和