[3.15] gh-148829: Add PySentinel_CheckExact() (GH-149725) (#149766)

gh-148829: Add PySentinel_CheckExact() (GH-149725)
(cherry picked from commit 94df62542c)

Co-authored-by: scoder <stefan_ml@behnel.de>
This commit is contained in:
Miss Islington (bot) 2026-05-13 12:39:38 +02:00 committed by GitHub
parent 4e369c1dea
commit a5f77a13fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 29 additions and 3 deletions

View file

@ -14,8 +14,20 @@ Sentinel objects
.. c:function:: int PySentinel_Check(PyObject *o)
Return true if *o* is a :class:`sentinel` object. The :class:`sentinel` type
does not allow subclasses, so this check is exact.
Return true if *o* is a :class:`sentinel` object or a subtype.
The :class:`sentinel` type does not currently allow subclasses,
so this check is exact.
Future Python versions may choose to allow subtyping.
This function always succeeds.
.. versionadded:: 3.15
.. c:function:: int PySentinel_CheckExact(PyObject *o)
Return true if *o* is a :class:`sentinel` object, but not a subtype.
The :class:`sentinel` type does not currently allow subclasses.
Future Python versions may choose to allow subtyping.
This function always succeeds.
.. versionadded:: 3.15

View file

@ -9,7 +9,10 @@ extern "C" {
PyAPI_DATA(PyTypeObject) PySentinel_Type;
#define PySentinel_Check(op) Py_IS_TYPE((op), &PySentinel_Type)
#define PySentinel_CheckExact(op) Py_IS_TYPE((op), &PySentinel_Type)
/* Alias as long as subclasses are not allowed. */
#define PySentinel_Check(op) PySentinel_CheckExact(op)
PyAPI_FUNC(PyObject *) PySentinel_New(
const char *name,

View file

@ -71,6 +71,8 @@ def test_pysentinel_new(self):
self.assertIs(type(marker), sentinel)
self.assertTrue(_testcapi.pysentinel_check(marker))
self.assertFalse(_testcapi.pysentinel_check(object()))
self.assertTrue(_testcapi.pysentinel_checkexact(marker))
self.assertFalse(_testcapi.pysentinel_checkexact(object()))
self.assertEqual(marker.__name__, "CAPI_SENTINEL")
self.assertEqual(marker.__module__, __name__)
self.assertEqual(repr(marker), "CAPI_SENTINEL")

View file

@ -0,0 +1,2 @@
Add :c:func:`PySentinel_CheckExact` for exact :class:`sentinel` type tests
to accompany the existing :c:func:`PySentinel_Check`.

View file

@ -572,6 +572,12 @@ pysentinel_check(PyObject *self, PyObject *obj)
return PyBool_FromLong(PySentinel_Check(obj));
}
static PyObject *
pysentinel_checkexact(PyObject *self, PyObject *obj)
{
return PyBool_FromLong(PySentinel_CheckExact(obj));
}
static PyMethodDef test_methods[] = {
{"call_pyobject_print", call_pyobject_print, METH_VARARGS},
@ -604,6 +610,7 @@ static PyMethodDef test_methods[] = {
{"pyobject_dump", pyobject_dump, METH_VARARGS},
{"pysentinel_new", pysentinel_new, METH_VARARGS},
{"pysentinel_check", pysentinel_check, METH_O},
{"pysentinel_checkexact", pysentinel_checkexact, METH_O},
{NULL},
};