Skip to content
Merged
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions Doc/c-api/structures.rst
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,25 @@ definition with the same method name.
slot. This is helpful because calls to PyCFunctions are optimized more
than wrapper object calls.


.. c:var:: PyTypeObject PyCMethod_Type

The type object corresponding to Python C method objects. This is
available as :class:`types.BuiltinMethodType` in the Python layer.


.. c:function:: int PyCMethod_Check(PyObject *op)

Return true if *op* is an instance of the :c:type:`PyCMethod_Type` type
or a subtype of it. This function always succeeds.


.. c:function:: int PyCMethod_CheckExact(PyObject *op)

This is the same as :c:func:`PyCMethod_Check`, but does not account for
subtypes.


.. c:function:: PyObject * PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)

Turn *ml* into a Python :term:`callable` object.
Expand All @@ -472,6 +491,24 @@ definition with the same method name.
.. versionadded:: 3.9


.. c:var:: PyTypeObject PyCFunction_Type

The type object corresponding to Python C function objects. This is
available as :class:`types.BuiltinFunctionType` in the Python layer.


.. c:function:: int PyCFunction_Check(PyObject *op)

Return true if *op* is an instance of the :c:type:`PyCFunction_Type` type
or a subtype of it. This function always succeeds.


.. c:function:: int PyCFunction_CheckExact(PyObject *op)

This is the same as :c:func:`PyCFunction_Check`, but does not account for
subtypes.


.. c:function:: PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)

Equivalent to ``PyCMethod_New(ml, self, module, NULL)``.
Expand All @@ -482,6 +519,63 @@ definition with the same method name.
Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``.


.. c:function:: int PyCFunction_GetFlags(PyObject *func)

Get the function's flags on *func* as they were passed to
:c:member:`~PyMethodDef.ml_flags`.

If *func* is not a C function object, this fails with a
:class:`SystemError`.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is a regular exception right? so no need to mention it. What I wanted to know is whether passing func == NULL produced a SIGSEGV or a Python exception. Since passing NULL is "allowed" (but raises an exception) it's fine to remove the mention to SystemError.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My advice is: check other Check functions to see how we formulate this. I don't want to be too pedantic but I want to be consistent in general.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one is a regular exception right? so no need to mention it. What I wanted to know is whether passing func == NULL produced a SIGSEGV or a Python exception. Since passing NULL is "allowed" (but raises an exception) it's fine to remove the mention to SystemError.

Ah, ok. NULL will result in a SIGSEGV, but a non-function will result in a SystemError. I updated the text to hopefully clarify that better.


This function returns the function's flags on success, and ``-1`` with an
exception set on failure.


.. c:function:: int PyCFunction_GET_FLAGS(PyObject *func)

This is the same as :c:func:`PyCFunction_GetFlags`, but without error
or type checking.


.. c:function:: PyCFunction PyCFunction_GetFunction(PyObject *func)

Get the function pointer on *func* as it was passed to
Comment thread
picnixz marked this conversation as resolved.
Comment thread
picnixz marked this conversation as resolved.
:c:member:`~PyMethodDef.ml_meth`.

If *func* is not a C function object, this fails with a
:class:`SystemError`.

This function returns the function pointer on success, and ``NULL`` with an
exception set on failure.



Copy link
Copy Markdown
Member

@picnixz picnixz Nov 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have 3 blank lines here. I'll let you edit this locally

.. c:function:: int PyCFunction_GET_FUNCTION(PyObject *func)

This is the same as :c:func:`PyCFunction_GetFunction`, but without error
or type checking.


.. c:function:: PyObject *PyCFunction_GetSelf(PyObject *func)

Get the "self" object on *func*. This is the object that would be passed
Comment thread
picnixz marked this conversation as resolved.
to the first argument of a :c:type:`PyCFunction`. For C function objects
created through a :c:type:`PyMethodDef` on a :c:type:`PyModuleDef`, this
is the resulting module object.

If *func* is not a C function object, this fails with a
:class:`SystemError`.

This function returns a :term:`borrowed reference` to the "self" object
on success, and ``NULL`` with an exception set on failure.


.. c:function:: PyObject *PyCFunction_GET_SELF(PyObject *func)

This is the same as :c:func:`PyCFunction_GetSelf`, but without error or
type checking.


Accessing attributes of extension types
---------------------------------------

Expand Down
Loading