[Python-ideas] Two small functional-style-related improvements

Jan Kaliszewski zuo at chopin.edu.pl
Sun Mar 27 15:05:36 CEST 2011


Steven D'Aprano dixit (2011-03-27, 14:41):

> Jan Kaliszewski wrote:
[...]
> >* operator.is_none -- equivalent to (lambda x: x is None))
> >* operator.is_not_none -- equivalent tolambda x: x is not None))
> >
> >...making using 'is None'/'is not None' tests with any(), all(),
> >filter(), itertools.takewhile/dropwhile() more convenient and readable
> >(possibly also optimised for speed).
> 
> How is
> 
> import operator
> any(map(operator.is_none, iterable))
> 
> more convenient and readable than:
> 
> any(x is None for x in iterable)

It isn't indeed -- but I'd prefer e.g.:

    filter(is_not_none, iterable)

...rather than:

    filter(None, (x is not None for x in iterable))

(not saying about more complex cases, when additional inner for-loop
makes the expression much less readable).

And --what is maybe more important-- such functions as
itertools.dropwhile, itertools.takewhile, itertools.groupby (together
with .sort/sorted) do not have their generator expression counterparts
(at least resonably simple ones). Ane then, if we wish to stay in the
functional-style we must use ugly lambdas/partial for now.

> >2. ...to add:
> >
> >* operator.anti_caller (or e.g. functools.negator?) -- equivalent to:
> >
> >def anti_caller(func):
> >    def call_and_negate(*args, **kwargs):
> >        return not func(*args, **kwargs)
> >    return call_and_negate
> 
> This seems to be a decorator, so I don't believe it belongs in the
> operator module.

Yes, maybe rather: functools.negated

> Either way, I don't see the point to it.
[...]
> What is your use-case for this function?

I'd would like to be able to do:

    assert any(dropwhile(negated(str.isalnum),
                         takewhile(negated(str.isspace), my_names)))

...instead of:

    assert any(dropwhile(lambda name: not name.isalnum(),
                         takewhile(lambda name: not name.isspace(),
                                   my_names)))

Regards.
*j




More information about the Python-ideas mailing list