bpo-36549: str.capitalize now titlecases the first character instead of uppercasing it (GH-12804)
This commit is contained in:
parent
f13c5c8b94
commit
b015fc86f7
@ -1509,6 +1509,10 @@ expression support in the :mod:`re` module).
|
|||||||
Return a copy of the string with its first character capitalized and the
|
Return a copy of the string with its first character capitalized and the
|
||||||
rest lowercased.
|
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()
|
.. method:: str.casefold()
|
||||||
|
|
||||||
@ -2052,8 +2056,7 @@ expression support in the :mod:`re` module).
|
|||||||
>>> import re
|
>>> import re
|
||||||
>>> def titlecase(s):
|
>>> def titlecase(s):
|
||||||
... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
|
... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",
|
||||||
... lambda mo: mo.group(0)[0].upper() +
|
... lambda mo: mo.group(0).capitalize(),
|
||||||
... mo.group(0)[1:].lower(),
|
|
||||||
... s)
|
... s)
|
||||||
...
|
...
|
||||||
>>> titlecase("they're bill's friends.")
|
>>> titlecase("they're bill's friends.")
|
||||||
|
@ -977,7 +977,7 @@ class CommonTest(BaseTest):
|
|||||||
def test_capitalize_nonascii(self):
|
def test_capitalize_nonascii(self):
|
||||||
# check that titlecased chars are lowered correctly
|
# check that titlecased chars are lowered correctly
|
||||||
# \u1ffc is the titlecased char
|
# \u1ffc is the titlecased char
|
||||||
self.checkequal('\u03a9\u0399\u1ff3\u1ff3\u1ff3',
|
self.checkequal('\u1ffc\u1ff3\u1ff3\u1ff3',
|
||||||
'\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize')
|
'\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize')
|
||||||
# check with cased non-letter chars
|
# check with cased non-letter chars
|
||||||
self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd',
|
self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd',
|
||||||
|
@ -811,7 +811,7 @@ class UnicodeTest(string_tests.CommonTest,
|
|||||||
self.assertEqual('h\u0130'.capitalize(), 'H\u0069\u0307')
|
self.assertEqual('h\u0130'.capitalize(), 'H\u0069\u0307')
|
||||||
exp = '\u0399\u0308\u0300\u0069\u0307'
|
exp = '\u0399\u0308\u0300\u0069\u0307'
|
||||||
self.assertEqual('\u1fd2\u0130'.capitalize(), exp)
|
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')
|
self.assertEqual('A\u0345\u03a3'.capitalize(), 'A\u0345\u03c2')
|
||||||
|
|
||||||
def test_title(self):
|
def test_title(self):
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Change str.capitalize to use titlecase for the first character instead of
|
||||||
|
uppercase.
|
@ -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];
|
Py_UCS4 c, mapped[3];
|
||||||
|
|
||||||
c = PyUnicode_READ(kind, data, 0);
|
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++) {
|
for (j = 0; j < n_res; j++) {
|
||||||
*maxchar = Py_MAX(*maxchar, mapped[j]);
|
*maxchar = Py_MAX(*maxchar, mapped[j]);
|
||||||
res[k++] = mapped[j];
|
res[k++] = mapped[j];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user