feature request: a better str.endswith

Michele Simionato mis6 at pitt.edu
Sun Jul 20 10:04:25 EDT 2003


"Raymond Hettinger" <vze4rx4y at verizon.net> wrote in message news:<NpkSa.16049$7O.14695 at nwrdny01.gnilink.net>..
> I prefer that this feature not be added.  Convenience functions
> like this one rarely pay for themselves because:
> 
>    -- The use case is not that common (afterall, endswith() isn't even
>        used that often).

This is arguable.

>    -- It complicates the heck out of the C code

Really? Of course, you are the expert. I would do it in analogy to 
"isinstance" and internally calling "ifilter" as you suggest.

>    -- Checking for optional arguments results in a slight slowdown
>        for the normal case.

Perhaps slight enough to be negligible? Of course without
implementation
we cannot say, but I would be surprised to have a sensible slowdown.

>    -- It is easy to implement a readable version in only two or three
>        lines of pure python.

Yes, but not immediately obvious. See later.

>    -- It is harder to read because it requires background knowledge
>       of how endswith() handles a tuple (quick, does it take any
>       iterable or just a tuple, how about a subclass of tuple; is it
>       like min() and max() in that it *args works just as well as
>       argtuple; which python version implemented it, etc).

I have used "isinstance" and never wondered about these
technicalities, so
I guess the average user should not be more concerned with .endswith.
  
>   -- It is a pain to keep the language consistent.  Change endswith()
>       and you should change startswith().  Change the string object and
>       you should also change the unicode object and UserString and
>       perhaps mmap.  Update the docs for each and add test cases for
>       each (including weird cases with zero-length tuples and such).

This is true for any modification of the language. One has to balance
costs and benefits. The balance is still largely subjective.
 
>   -- The use case above encroaches on scanning patterns that are
>       already efficiently implemented by the re module.

I think the general rule is to avoid regular expressions when
possible.

>   -- Worst of all, it increases the sum total of python language to be
>       learned without providing much in return.

That it is exactly what I am arguing *against*: there is no additional
learning
effort needed, since a similar feature is already present in
"isinstance"
and an user could be even surprised that it is not implemented in
.endswith.

>   -- In general, the language can be kept more compact, efficient, and
>      maintainable by not trying to vectorize everything (the recent addition
>      of the __builtin__.sum() is a rare exception that is worth it).  It is
>      better to use a general purpose vectorizing function (like map, filter,
>      or reduce).  This particular case is best implemented in terms of the
>      some() predicate documented in the examples for the new itertools module
>      (though any() might have been a better name for it):
> 
>          some(filename.endswith, ('.jpg','.jpeg','.gif','.png'))

Uhm... don't like "some", nor "any"; what about "the"?

import itertools
the=lambda pred,seq: list(itertools.ifilter(pred,seq))
for filename in os.listdir('.'):
    if the(filename.endswith, ('.jpg','.jpeg','.gif','.png')): 
        print "This is a valid image"

That's readable enough for me, still not completely obvious. The first
time,
I got it wrong by defining "the=itertools.ifilter". I had the idea
that "ifilter" was acting just as "filter", which of course is not the
case
in this example. 

>      The implementation of some() is better than the filter version because
>      it provides an "early-out" upon the first successful hit.

No point against that.
> 
> Raymond Hettinger

Michele Simionato

P.S. I am not going to pursue this further, since I like quite a lot

 if the(filename.endswith, ('.jpg','.jpeg','.gif','.png')):
    dosomething()

Instead, I will suggest this example to be added to the itertools
documentation ;)
I could also submit it as a cookbook recipe, since I think it is 
a quite useful trick.
Also, it is good to make people aware of itertool goodies 
(myself I have learned something in this thread).




More information about the Python-list mailing list