diff options
author | Erlend E. Aasland <erlend.aasland@protonmail.com> | 2023-05-05 11:32:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-05 11:32:00 (GMT) |
commit | 721a78395d07c68351625aedb827a47dd4f48525 (patch) | |
tree | e5591ed98ed1651feac40112f78ebfd018ac8d38 /Doc/howto | |
parent | 2318bedb3645d2dfb56944553f01d6c434904c4b (diff) | |
download | cpython-721a78395d07c68351625aedb827a47dd4f48525.zip cpython-721a78395d07c68351625aedb827a47dd4f48525.tar.gz cpython-721a78395d07c68351625aedb827a47dd4f48525.tar.bz2 |
gh-64658: Expand Argument Clinic return converter docs (#104175)
Diffstat (limited to 'Doc/howto')
-rw-r--r-- | Doc/howto/clinic.rst | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 8a10fe3..6ebc2d9 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -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 +: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. @@ -1066,19 +1083,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. To see all the return converters Argument Clinic supports, along with their parameters (if any), |