[Python-ideas] fnmatch.filter_false
Steven D'Aprano
steve at pearwood.info
Wed May 17 21:00:40 EDT 2017
On Wed, May 17, 2017 at 12:14:05PM -0400, Alex Walters wrote:
> Fnmath.filter works great. To remind people what it does, it takes an
> iterable of strings and a pattern and returns a list of the strings that
> match the pattern. And that is wonderful
>
> However, I often need to filter *out* the items that match the pattern (to
> ignore them). In every project that I need this I end up copying the
> function out of the fnmatch library and adding 'not' to the test clause.
At the cost of a slight inefficiency, you could use the pure Python
equivalent given in the docs:
https://docs.python.org/3/library/fnmatch.html#fnmatch.filter
fnmatch.filter(names, pattern)
Return the subset of the list of names that match pattern. It is
the same as [n for n in names if fnmatch(n, pattern)], but implemented
more efficiently.
So your filter_false is:
[n for n in names if not fnmatch(n, pattern)]
which avoids the need for the copy-and-paste anti-pattern.
Otherwise, I would support:
- filter_false
- or a glob symbol to reverse the sense of the test, e.g. ~ or !
as the first character;
but I dislike functions that take boolean arguments to change their
behaviour. It's not a 100% hard and fast rule, but in general I prefer
to avoid functions that take a constant bool argument:
# rather than this:
function(important_args, True)
function(important_args, False)
# use this:
function(important_args)
function_false(important_args)
(although there may be exceptions).
--
Steve
More information about the Python-ideas
mailing list