[Python-ideas] Allow filter(items)

Terry Reedy tjreedy at udel.edu
Wed Aug 7 23:39:07 CEST 2013


On 8/7/2013 4:54 PM, Andrew Barnert wrote:
 > On Aug 7, 2013, at 10:31, Terry Reedy <tjreedy at udel.edu> wrote:
 >
 >> On 8/7/2013 6:01 AM, Alexander Belopolsky wrote:
 >>
 >>>  From Guido's time machine comes a pronouncement:
 >> <http://bugs.python.org/issue2186#msg63026>.
 >>
 >> As Raymond points out in a later message, it is standard in Python 
for None passed to a function to mean 'no argument, do something that 
does not require an value for this parameter'. It does not mean 'use a 
value of None for this parameter and do with None whatever would be done 
with any other value'.
 >>
 >> Usually, only trailing parameters are allowed to be given None and 
then it is given in the definition as a default.
 >>   def f(a, b=None, c=None): pass
 >> can be called f(x), f(x, y), f(x, y, z), and f(x, None, z) or f(x, 
c=z). Because of the last option, there is never a need for the user to 
explicitly pass None.
 >>
 >> What is unusual about filter is not the use of None to mean 'no 
argument, behave differently', but the need for it to be written 
explicitly by the caller to get the null behavior.
 >
 > There are other functions like that. For example, to set a max split, 
but still get the default behavior of splitting on any whitespace 
instead of a specific character, you have to write s.split(None, 2).

As with "f(x, None, z) or f(x, c=z)', that, *or*
 >>> 'a b c d'.split(maxsplit=2)
['a', 'b', 'c d']

.split is similar to filter in using None to mean 'do something 
different'. In this case, it is 'do not split an any one string but on 
any whitespace span. I believe this is equivalent to re.split('\s+', 
...), but without importing the re module and invoking it full overhead.

 > I'm not suggesting that it's an ideal design, just that it's not 
uniquely special to filter.

If one tries the 'or' option with filter

filter(iterable=[0,1,2])
Traceback (most recent call last):
   File "<pyshell#3>", line 1, in <module>
     filter(iterable=[0,1,2])
TypeError: filter() does not take keyword arguments

and even if it did, one would get a TypeError for passing only 1 arg 
when 2 are needed.

-- 
Terry Jan Reedy
-- 
Terry Jan Reedy



More information about the Python-ideas mailing list