[Python-ideas] fnmatch.filter_false

אלעזר elazarg at gmail.com
Wed May 17 16:53:49 EDT 2017


There shouldn't be any difference at all. Checking the for invert can be
outside of the loop, which will make the loop itself exactly as it is now.
Just like what's been done with normcase.

On Wed, May 17, 2017 at 8:55 PM <tritium-list at sdamon.com> wrote:

> Top posting, apologies.
>
> I'm sure there is a better way to do it, and there is a performance hit,
> but
> its negligible.  This is also a three line delta of the function.
>
> from fnmatch import _compile_pattern, filter as old_filter
> import os
> import os.path
> import posixpath
>
>
> data = os.listdir()
>
> def filter(names, pat, *, invert=False):
>     """Return the subset of the list NAMES that match PAT."""
>     result = []
>     pat = os.path.normcase(pat)
>     match = _compile_pattern(pat)
>     if os.path is posixpath:
>         # normcase on posix is NOP. Optimize it away from the loop.
>         for name in names:
>             if bool(match(name)) == (not invert):
>                 result.append(name)
>     else:
>         for name in names:
>             if bool(match(os.path.normcase(name))) == (not invert):
>                 result.append(name)
>     return result
>
> if __name__ == '__main__':
>     import timeit
>     print(timeit.timeit(
>         "filter(data, '__*')",
>         setup="from __main__ import filter, data"
>      ))
>     print(timeit.timeit(
>         "filter(data, '__*')",
>         setup="from __main__ import old_filter as filter, data"
>     ))
>
> The first test (modified code) timed at 22.492161903402575, where the
> second
> test (unmodified) timed at 19.555531892032324
>
>
>
> > -----Original Message-----
> > From: tritium-list at sdamon.com [mailto:tritium-list at sdamon.com]
> > Sent: Wednesday, May 17, 2017 1:19 PM
> > To: python-ideas at python.org
> > Subject: RE: [Python-ideas] fnmatch.filter_false
> >
> > > -----Original Message-----
> > > From: Python-ideas [mailto:python-ideas-bounces+tritium-
> > > list=sdamon.com at python.org] On Behalf Of Oleg Broytman
> > > Sent: Wednesday, May 17, 2017 12:44 PM
> > > To: python-ideas at python.org
> > > Subject: Re: [Python-ideas] fnmatch.filter_false
> > >
> > > On Wed, May 17, 2017 at 12:14:05PM -0400, Alex Walters <tritium-
> > > list at sdamon.com> 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.
> > It
> > > > would be wonderful if there was a filter_false version in the
> standard
> > > > library.  Or in inversion Boolean option.  Or something, to stop from
> > having
> > > > to copy code every time I need to ignore files.
> > >
> > >    Why not create a package and publish at PyPI? Then all you need is
> > > pip install fnmatch_filter_false
> > >    in your virtual env.
> >
> > That is my normal thought on something like this, but in the case of
> adding
> > a Boolean argument to fnmatch.filter, it (might be) as simple as a 3 line
> > diff that does not break the API, and as far as I can tell, does not have
> > performance implications.  Copying a module out of the standard library
> that
> > is identical except a 3 line diff that does not break compatibility with
> the
> > standard library... that just wreaks of something that should be in the
> > standard library to begin with.
> >
> > In the case of adding a separate function to fnmatch, it's still not that
> > big of a diff, and wouldn't have much duplicated code, at least in the
> way
> I
> > would implement it - it would essentially do the previous Boolean option
> > method, and wrap that.  A filter_false function, now that I think about
> it,
> > is less ideal than just adding a keyword only Boolean option to
> > fnmatch.filter.
> >
> > > Oleg.
> > > --
> > >      Oleg Broytman            http://phdru.name/
> phd at phdru.name
> > >            Programmers don't die, they just GOSUB without RETURN.
> > > _______________________________________________
> > > Python-ideas mailing list
> > > Python-ideas at python.org
> > > https://mail.python.org/mailman/listinfo/python-ideas
> > > Code of Conduct: http://python.org/psf/codeofconduct/
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170517/b5bb200c/attachment-0001.html>


More information about the Python-ideas mailing list