Ivan Pozdeez wrote: > I must note that names conforming to https://www.python.org/dev/peps/pep-0008/#function-and-variable-names would be "strip_prefix" and "strip_suffix".
In this case, being in line with the existing string API method names take priority over PEP 8, e.g. splitlines, startswith, endswith, splitlines, etc. Although I agree that an underscore would probably be a bit easier to read here, it would be rather confusing to randomly swap between the naming convention for the same API. The benefit gained in *slightly *easier readability wouldn't make up for the headache IMO. On Sun, Mar 22, 2020 at 12:13 AM Ivan Pozdeev via Python-Dev < python-dev@python.org> wrote: > On 22.03.2020 6:38, Guido van Rossum wrote: > > On Sat, Mar 21, 2020 at 6:46 PM Nick Coghlan <ncogh...@gmail.com> wrote: > >> On Sat., 21 Mar. 2020, 11:19 am Nathaniel Smith, <n...@pobox.com> wrote: >> >>> On Fri, Mar 20, 2020 at 11:54 AM Dennis Sweeney >>> <sweeney.dennis...@gmail.com> wrote: >>> > This is a proposal to add two new methods, ``cutprefix`` and >>> > ``cutsuffix``, to the APIs of Python's various string objects. >>> >>> The names should use "start" and "end" instead of "prefix" and >>> "suffix", to reduce the jargon factor and for consistency with >>> startswith/endswith. >>> >> >> This would also be more consistent with startswith() & endswith(). (For >> folks querying this: the relevant domain here is "str builtin method >> names", and we already use startswith/endswith there, not >> hasprefix/hassuffix. The most challenging relevant audience for new str >> builtin method *names* is also 10 year olds learning to program in school, >> not adults reading the documentation) >> > > To my language sense, hasprefix/hassuffix are horrible compared to > startswith/endswith. If you were to talk about this kind of condition using > English instead of Python, you wouldn't say "if x has prefix y", you'd say > "if x starts with y". (I doubt any programming language uses hasPrefix or > has_prefix for this, making it a strawman.) > > *But*, what would you say if you wanted to express the idea or removing > something from the start or end? It's pretty verbose to say "remove y from > the end of x", and it's not easy to translate that into a method name. > x.removefromend(y)? Blech! And x.removeend(y) has the double 'e', which > confuses the reader. > > The thing is that it's hard to translate "starts" (a verb) into a noun -- > the "start" of something is its very beginning (i.e., in Python, position > zero), while a "prefix" is a noun that specifically describes an initial > substring (and I'm glad we don't have to use *that* :-). > > >> I think the concern about stripstart() & stripend() working with >> substrings, while strip/lstrip/rstrip work with character sets, is valid, >> but I also share the concern about introducing "cut" as yet another verb to >> learn in the already wide string API. >> > > It's not great, and I actually think that "stripprefix" and "stripsuffix" > are reasonable. (I found that in Go, everything we call "strip" is called > "Trim", and there are "TrimPrefix" and "TrimSuffix" functions that > correspond to the PEP 616 functions.) > > I must note that names conforming to > https://www.python.org/dev/peps/pep-0008/#function-and-variable-names > would be "strip_prefix" and "strip_suffix". > > > >> The example where the new function was used instead of a questionable use >> of replace gave me an idea, though: what if the new functions were >> "replacestart()" and "replaceend()"? >> >> * uses "start" and "with" for consistency with the existing checks >> * substring based, like the "replace" method >> * can be combined with an extension of "replace()" to also accept a tuple >> of old values to match and replace to allow for consistency with checking >> for multiple prefixes or suffixes. >> >> We'd expect the most common case to be the empty string, but I think the >> meaning of the following is clear, and consistent with the current practice >> of using replace() to delete text from anywhere within the string: >> >> s = s.replacestart('context.' , '') >> > > This feels like a hypergeneralization. In 99.9% of use cases we just need > to remove the prefix or suffix. If you want to replace the suffix with > something else, you can probably use string concatenation. (In the one use > case I can think of, changing "foo.c" into "foo.o", it would make sense > that plain "foo" ended up becoming "foo.o", so s.stripsuffix(".c") + ".o" > actually works better there. > > >> This approach would also very cleanly handle the last example from the >> PEP: >> >> s = s.replaceend(('Mixin', 'Tests', 'Test'), '') >> > > Maybe the proposed functions can optionally take a tuple of > prefixes/suffixes, like startswith/endswith do? > > >> The doubled 'e' in 'replaceend' isn't ideal, but if we went this way, I >> think keeping consistency with other str method names would be preferable >> to adding an underscore to the name. >> > > Agreed on the second part, I just really don't like the 'ee'. > > >> Interestingly, you could also use this to match multiple prefixes or >> suffixes and find out *which one* matched (since the existing methods don't >> report that): >> >> s2 = s.replaceend(suffixes, '') >> suffix_len = len(s) - len(s2) >> suffix = s[-suffix-len:] if suffix_len else None >> >> Cheers, >> Nick. >> > > -- > --Guido van Rossum (python.org/~guido) > *Pronouns: he/him **(why is my pronoun here?)* > <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/> > > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to > python-dev-leave@python.orghttps://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/Q33NGX3N4JEI3ECUW3WBL33EX2JR3Y5C/ > Code of Conduct: http://python.org/psf/codeofconduct/ > > -- > Regards, > Ivan > > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to python-dev-le...@python.org > https://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/WW4V6S7BSBOP2VU4OCLGANMPVQYY7A4O/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/TB5UXJR77SEDDGQHFXCJO4AIU6LJ3VCI/ Code of Conduct: http://python.org/psf/codeofconduct/