Skip to content

Commit

Permalink
[3.11] pythongh-64658: Expand Argument Clinic return converter docs (p…
Browse files Browse the repository at this point in the history
  • Loading branch information
erlend-aasland committed May 5, 2023
1 parent 81902d3 commit ea0eac3
Showing 1 changed file with 28 additions and 13 deletions.
41 changes: 28 additions & 13 deletions Doc/howto/clinic.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1025,19 +1025,36 @@ you're not permitted to use:
Using a return converter
------------------------

By default the impl function Argument Clinic generates for you returns ``PyObject *``.
But your C function often computes some C type, then converts it into the ``PyObject *``
By default, the impl function Argument Clinic generates for you returns
:c:type:`PyObject * <PyObject>`.
But your C function often computes some C type,
then converts it into the :c:type:`!PyObject *`
at the last moment. Argument Clinic handles converting your inputs from Python types
into native C types—why not have it convert your return value from a native C type
into a Python type too?

That's what a "return converter" does. It changes your impl function to return
some C type, then adds code to the generated (non-impl) function to handle converting
that value into the appropriate ``PyObject *``.
that value into the appropriate :c:type:`!PyObject *`.

The syntax for return converters is similar to that of parameter converters.
You specify the return converter like it was a return annotation on the
function itself. Return converters behave much the same as parameter converters;
function itself, using ``->`` notation.

For example:

.. code-block:: c
/*[clinic input]
add -> int
a: int
b: int
/
[clinic start generated code]*/
Return converters behave much the same as parameter converters;
they take arguments, the arguments are all keyword-only, and if you're not changing
any of the default arguments you can omit the parentheses.

Expand All @@ -1058,19 +1075,17 @@ Currently Argument Clinic supports only a few return converters:
.. code-block:: none
bool
double
float
int
unsigned int
long
unsigned int
size_t
Py_ssize_t
float
double
DecodeFSDefault
size_t
unsigned int
unsigned long
None of these take parameters. For the first three, return -1 to indicate
error. For ``DecodeFSDefault``, the return type is ``const char *``; return a ``NULL``
pointer to indicate an error.
None of these take parameters.
For all of these, return ``-1`` to indicate error.

(There's also an experimental ``NoneType`` converter, which lets you
return ``Py_None`` on success or ``NULL`` on failure, without having
Expand Down

0 comments on commit ea0eac3

Please sign in to comment.