https://github.com/python/cpython/commit/bb2b9ba49d8a60629f0905bc27191fc84db39879
commit: bb2b9ba49d8a60629f0905bc27191fc84db39879
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2026-01-19T12:37:41Z
summary:
gh-143897: Remove the isxidstart() and isxidcontinue() methods of
unicodedata.ucd_3_2_0 (GH-143898)
They are now only exposed as the unicodedata function.
files:
A Misc/NEWS.d/next/Library/2026-01-16-10-53-17.gh-issue-143897.hWJBHN.rst
M Lib/test/test_unicodedata.py
M Modules/clinic/unicodedata.c.h
M Modules/unicodedata.c
diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py
index 07aa992de6d706..f9c0cd20438174 100644
--- a/Lib/test/test_unicodedata.py
+++ b/Lib/test/test_unicodedata.py
@@ -83,15 +83,7 @@ def test_method_checksum(self):
self.assertEqual(result, self.expectedchecksum)
-class UnicodeFunctionsTest(unittest.TestCase):
- db = unicodedata
- old = False
-
- # Update this if the database changes. Make sure to do a full rebuild
- # (e.g. 'make distclean && make') to get the correct checksum.
- expectedchecksum = ('83cc43a2fbb779185832b4c049217d80b05bf349'
- if quicktest else
- '65670ae03a324c5f9e826a4de3e25bae4d73c9b7')
+class BaseUnicodeFunctionsTest:
def test_function_checksum(self):
db = self.db
@@ -589,6 +581,16 @@ def test_east_asian_width_unassigned(self):
self.assertEqual(eaw(char), 'A')
self.assertIs(self.db.name(char, None), None)
+class UnicodeFunctionsTest(unittest.TestCase, BaseUnicodeFunctionsTest):
+ db = unicodedata
+ old = False
+
+ # Update this if the database changes. Make sure to do a full rebuild
+ # (e.g. 'make distclean && make') to get the correct checksum.
+ expectedchecksum = ('83cc43a2fbb779185832b4c049217d80b05bf349'
+ if quicktest else
+ '65670ae03a324c5f9e826a4de3e25bae4d73c9b7')
+
def test_isxidstart(self):
self.assertTrue(self.db.isxidstart('S'))
self.assertTrue(self.db.isxidstart('\u0AD0')) # GUJARATI OM
@@ -832,18 +834,13 @@ def graphemes(*args):
['a', '\U0001F1FA\U0001F1E6', '\U0001F1FA\U0001F1F3'])
-class Unicode_3_2_0_FunctionsTest(UnicodeFunctionsTest):
+class Unicode_3_2_0_FunctionsTest(unittest.TestCase, BaseUnicodeFunctionsTest):
db = unicodedata.ucd_3_2_0
old = True
expectedchecksum = ('f4526159891a4b766dd48045646547178737ba09'
if quicktest else
'f217b8688d7bdff31db4207e078a96702f091597')
- test_grapheme_cluster_break = None
- test_indic_conjunct_break = None
- test_extended_pictographic = None
- test_grapheme_break = None
-
class UnicodeMiscTest(unittest.TestCase):
db = unicodedata
diff --git
a/Misc/NEWS.d/next/Library/2026-01-16-10-53-17.gh-issue-143897.hWJBHN.rst
b/Misc/NEWS.d/next/Library/2026-01-16-10-53-17.gh-issue-143897.hWJBHN.rst
new file mode 100644
index 00000000000000..d53eac0bd356ea
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-01-16-10-53-17.gh-issue-143897.hWJBHN.rst
@@ -0,0 +1,3 @@
+Remove the :meth:`!isxidstart` and :meth:`!isxidcontinue` methods of
+:data:`unicodedata.ucd_3_2_0`. They are now only exposed as
+:func:`unicodedata.isxidstart` and :func:`unicodedata.isxidcontinue`.
diff --git a/Modules/clinic/unicodedata.c.h b/Modules/clinic/unicodedata.c.h
index c0497cf45f6cff..8e2dd7a0ce5663 100644
--- a/Modules/clinic/unicodedata.c.h
+++ b/Modules/clinic/unicodedata.c.h
@@ -519,20 +519,20 @@ unicodedata_UCD_name(PyObject *self, PyObject *const
*args, Py_ssize_t nargs)
return return_value;
}
-PyDoc_STRVAR(unicodedata_UCD_isxidstart__doc__,
-"isxidstart($self, chr, /)\n"
+PyDoc_STRVAR(unicodedata_isxidstart__doc__,
+"isxidstart($module, chr, /)\n"
"--\n"
"\n"
"Return True if the character has the XID_Start property, else False.");
-#define UNICODEDATA_UCD_ISXIDSTART_METHODDEF \
- {"isxidstart", (PyCFunction)unicodedata_UCD_isxidstart, METH_O,
unicodedata_UCD_isxidstart__doc__},
+#define UNICODEDATA_ISXIDSTART_METHODDEF \
+ {"isxidstart", (PyCFunction)unicodedata_isxidstart, METH_O,
unicodedata_isxidstart__doc__},
static PyObject *
-unicodedata_UCD_isxidstart_impl(PyObject *self, int chr);
+unicodedata_isxidstart_impl(PyObject *module, int chr);
static PyObject *
-unicodedata_UCD_isxidstart(PyObject *self, PyObject *arg)
+unicodedata_isxidstart(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
int chr;
@@ -549,26 +549,26 @@ unicodedata_UCD_isxidstart(PyObject *self, PyObject *arg)
goto exit;
}
chr = PyUnicode_READ_CHAR(arg, 0);
- return_value = unicodedata_UCD_isxidstart_impl(self, chr);
+ return_value = unicodedata_isxidstart_impl(module, chr);
exit:
return return_value;
}
-PyDoc_STRVAR(unicodedata_UCD_isxidcontinue__doc__,
-"isxidcontinue($self, chr, /)\n"
+PyDoc_STRVAR(unicodedata_isxidcontinue__doc__,
+"isxidcontinue($module, chr, /)\n"
"--\n"
"\n"
"Return True if the character has the XID_Continue property, else False.");
-#define UNICODEDATA_UCD_ISXIDCONTINUE_METHODDEF \
- {"isxidcontinue", (PyCFunction)unicodedata_UCD_isxidcontinue, METH_O,
unicodedata_UCD_isxidcontinue__doc__},
+#define UNICODEDATA_ISXIDCONTINUE_METHODDEF \
+ {"isxidcontinue", (PyCFunction)unicodedata_isxidcontinue, METH_O,
unicodedata_isxidcontinue__doc__},
static PyObject *
-unicodedata_UCD_isxidcontinue_impl(PyObject *self, int chr);
+unicodedata_isxidcontinue_impl(PyObject *module, int chr);
static PyObject *
-unicodedata_UCD_isxidcontinue(PyObject *self, PyObject *arg)
+unicodedata_isxidcontinue(PyObject *module, PyObject *arg)
{
PyObject *return_value = NULL;
int chr;
@@ -585,7 +585,7 @@ unicodedata_UCD_isxidcontinue(PyObject *self, PyObject *arg)
goto exit;
}
chr = PyUnicode_READ_CHAR(arg, 0);
- return_value = unicodedata_UCD_isxidcontinue_impl(self, chr);
+ return_value = unicodedata_isxidcontinue_impl(module, chr);
exit:
return return_value;
@@ -798,4 +798,4 @@ unicodedata_extended_pictographic(PyObject *module,
PyObject *arg)
exit:
return return_value;
}
-/*[clinic end generated code: output=6991246310e3f2aa input=a9049054013a1b77]*/
+/*[clinic end generated code: output=0f09cc90f06ace76 input=a9049054013a1b77]*/
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 6904ee14811d48..586ce8d36dd46f 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -1565,9 +1565,8 @@ unicodedata_UCD_name_impl(PyObject *self, int chr,
PyObject *default_value)
}
/*[clinic input]
-unicodedata.UCD.isxidstart
+unicodedata.isxidstart
- self: self
chr: int(accept={str})
/
@@ -1576,24 +1575,15 @@ Return True if the character has the XID_Start
property, else False.
[clinic start generated code]*/
static PyObject *
-unicodedata_UCD_isxidstart_impl(PyObject *self, int chr)
-/*[clinic end generated code: output=944005823c72c3ef input=9353f88d709c21fb]*/
+unicodedata_isxidstart_impl(PyObject *module, int chr)
+/*[clinic end generated code: output=7ae0e1a3915aa031 input=3812717f3a6bfc56]*/
{
- if (UCD_Check(self)) {
- const change_record *old = get_old_record(self, chr);
- if (old->category_changed == 0) {
- /* unassigned */
- Py_RETURN_FALSE;
- }
- }
-
return PyBool_FromLong(_PyUnicode_IsXidStart(chr));
}
/*[clinic input]
-unicodedata.UCD.isxidcontinue
+unicodedata.isxidcontinue
- self: self
chr: int(accept={str})
/
@@ -1602,17 +1592,9 @@ Return True if the character has the XID_Continue
property, else False.
[clinic start generated code]*/
static PyObject *
-unicodedata_UCD_isxidcontinue_impl(PyObject *self, int chr)
-/*[clinic end generated code: output=9438dcbff5ca3e41 input=bbb8dd3ac0d2d709]*/
+unicodedata_isxidcontinue_impl(PyObject *module, int chr)
+/*[clinic end generated code: output=517caa8b38c73aed input=a971ed6e57cac374]*/
{
- if (UCD_Check(self)) {
- const change_record *old = get_old_record(self, chr);
- if (old->category_changed == 0) {
- /* unassigned */
- Py_RETURN_FALSE;
- }
- }
-
return PyBool_FromLong(_PyUnicode_IsXidContinue(chr));
}
@@ -2128,10 +2110,12 @@ static PyMethodDef unicodedata_functions[] = {
UNICODEDATA_INDIC_CONJUNCT_BREAK_METHODDEF
UNICODEDATA_EXTENDED_PICTOGRAPHIC_METHODDEF
UNICODEDATA_ITER_GRAPHEMES_METHODDEF
+ UNICODEDATA_ISXIDSTART_METHODDEF
+ UNICODEDATA_ISXIDCONTINUE_METHODDEF
// The following definitions are shared between the module
// and the UCD class.
-#define DB_methods (unicodedata_functions + 4)
+#define DB_methods (unicodedata_functions + 6)
UNICODEDATA_UCD_DECIMAL_METHODDEF
UNICODEDATA_UCD_DIGIT_METHODDEF
@@ -2143,8 +2127,6 @@ static PyMethodDef unicodedata_functions[] = {
UNICODEDATA_UCD_EAST_ASIAN_WIDTH_METHODDEF
UNICODEDATA_UCD_DECOMPOSITION_METHODDEF
UNICODEDATA_UCD_NAME_METHODDEF
- UNICODEDATA_UCD_ISXIDSTART_METHODDEF
- UNICODEDATA_UCD_ISXIDCONTINUE_METHODDEF
UNICODEDATA_UCD_LOOKUP_METHODDEF
UNICODEDATA_UCD_IS_NORMALIZED_METHODDEF
UNICODEDATA_UCD_NORMALIZE_METHODDEF
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]