summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/stdtypes.rst7
-rw-r--r--Lib/test/string_tests.py2
-rw-r--r--Lib/test/test_unicode.py2
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-04-11-12-41-31.bpo-36549.QSp8of.rst2
-rw-r--r--Objects/unicodeobject.c2
5 files changed, 10 insertions, 5 deletions
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];