mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
This commit is contained in:
parent
81902d3ed3
commit
a635d63860
1 changed files with 30 additions and 15 deletions
|
@ -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.
|
||||
|
||||
|
@ -1058,19 +1075,17 @@ Currently Argument Clinic supports only a few return converters:
|
|||
.. code-block:: none
|
||||
|
||||
bool
|
||||
int
|
||||
unsigned int
|
||||
long
|
||||
unsigned int
|
||||
size_t
|
||||
Py_ssize_t
|
||||
float
|
||||
double
|
||||
DecodeFSDefault
|
||||
float
|
||||
int
|
||||
long
|
||||
Py_ssize_t
|
||||
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue