From b015fc86f7b1f35283804bfee788cce0a5495df7 Mon Sep 17 00:00:00 2001 From: Kingsley M <37349466+kingdom5500@users.noreply.github.com> Date: Fri, 12 Apr 2019 16:35:39 +0100 Subject: bpo-36549: str.capitalize now titlecases the first character instead of uppercasing it (GH-12804) --- Doc/library/stdtypes.rst | 7 +++++-- Lib/test/string_tests.py | 2 +- Lib/test/test_unicode.py | 2 +- .../Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst | 2 ++ Objects/unicodeobject.c | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index bae989e..aeecdbb 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1509,6 +1509,10 @@ expression support in the :mod:`re` module). Return a copy of the string with its first character capitalized and the rest lowercased. + .. versionchanged:: 3.8 + The first character is now put into titlecase rather than uppercase. + This means that characters like digraphs will only have their first + letter capitalized, instead of the full character. .. method:: str.casefold() @@ -2052,8 +2056,7 @@ expression support in the :mod:`re` module). >>> import re >>> def titlecase(s): ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", - ... lambda mo: mo.group(0)[0].upper() + - ... mo.group(0)[1:].lower(), + ... lambda mo: mo.group(0).capitalize(), ... s) ... >>> titlecase("they're bill's friends.") diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py index 561b09a..836a43b 100644 --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -977,7 +977,7 @@ class CommonTest(BaseTest): def test_capitalize_nonascii(self): # check that titlecased chars are lowered correctly # \u1ffc is the titlecased char - self.checkequal('\u03a9\u0399\u1ff3\u1ff3\u1ff3', + self.checkequal('\u1ffc\u1ff3\u1ff3\u1ff3', '\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize') # check with cased non-letter chars self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd', diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 1131efd..36b72e4 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -811,7 +811,7 @@ class UnicodeTest(string_tests.CommonTest, self.assertEqual('h\u0130'.capitalize(), 'H\u0069\u0307') exp = '\u0399\u0308\u0300\u0069\u0307' self.assertEqual('\u1fd2\u0130'.capitalize(), exp) - self.assertEqual('finnish'.capitalize(), 'FInnish') + self.assertEqual('finnish'.capitalize(), 'Finnish') self.assertEqual('A\u0345\u03a3'.capitalize(), 'A\u0345\u03c2') def test_title(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst new file mode 100644 index 0000000..9c6834c --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst @@ -0,0 +1,2 @@ +Change str.capitalize to use titlecase for the first character instead of +uppercase. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index c0b345b..e00dc37 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9675,7 +9675,7 @@ do_capitalize(int kind, void *data, Py_ssize_t length, Py_UCS4 *res, Py_UCS4 *ma Py_UCS4 c, mapped[3]; c = PyUnicode_READ(kind, data, 0); - n_res = _PyUnicode_ToUpperFull(c, mapped); + n_res = _PyUnicode_ToTitleFull(c, mapped); for (j = 0; j < n_res; j++) { *maxchar = Py_MAX(*maxchar, mapped[j]); res[k++] = mapped[j]; -- cgit v0.12