Visitar URL original
gh-64658: Expand Argument Clinic return converter docs by erlend-aasland 路 Pull Request #104175 路 python/cpython 路 GitHub
Skip to content
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Add example
  • Loading branch information
erlend-aasland committed May 4, 2023
commit fc832433d5b705183c2f60e4b799fd49fcce2b54
27 changes: 22 additions & 5 deletions Doc/howto/clinic.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1033,19 +1033,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
Comment thread
erlend-aasland marked this conversation as resolved.
Outdated
:c:type:`PyObject * <PyObject>`.
But your C function often computes some C type, then converts it into the
:c:type:`!PyObject *`
Comment thread
erlend-aasland marked this conversation as resolved.
Outdated
at the last moment. Argument Clinic handles converting your inputs from Python types
into native C types鈥攚hy 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 Down Expand Up @@ -1076,7 +1093,7 @@ Currently Argument Clinic supports only a few return converters:
unsigned long

None of these take parameters.
Return ``-1`` to indicate error.
For all of these, return ``-1`` to indicate error.

To see all the return converters Argument Clinic supports, along with
their parameters (if any),
Expand Down