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)

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.

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 approach would also very cleanly handle the last example from the PEP:

    s = s.replaceend(('Mixin', 'Tests', 'Test'), '')

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.

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.


>
_______________________________________________
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/VQULYFFT4VVXV35RE5ETR5MOZSHLPFTV/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to