Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 1 | .. highlight:: c |
| 2 | |
| 3 | .. _call: |
| 4 | |
| 5 | Call Protocol |
| 6 | ============= |
| 7 | |
| 8 | CPython supports two different calling protocols: |
| 9 | *tp_call* and vectorcall. |
| 10 | |
| 11 | The *tp_call* Protocol |
| 12 | ---------------------- |
| 13 | |
| 14 | Instances of classes that set :c:member:`~PyTypeObject.tp_call` are callable. |
| 15 | The signature of the slot is:: |
| 16 | |
| 17 | PyObject *tp_call(PyObject *callable, PyObject *args, PyObject *kwargs); |
| 18 | |
| 19 | A call is made using a tuple for the positional arguments |
| 20 | and a dict for the keyword arguments, similarly to |
| 21 | ``callable(*args, **kwargs)`` in Python code. |
| 22 | *args* must be non-NULL (use an empty tuple if there are no arguments) |
| 23 | but *kwargs* may be *NULL* if there are no keyword arguments. |
| 24 | |
| 25 | This convention is not only used by *tp_call*: |
| 26 | :c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_init` |
| 27 | also pass arguments this way. |
| 28 | |
| 29 | To call an object, use :c:func:`PyObject_Call` or other |
| 30 | :ref:`call API <capi-call>`. |
| 31 | |
| 32 | |
| 33 | .. _vectorcall: |
| 34 | |
| 35 | The Vectorcall Protocol |
| 36 | ----------------------- |
| 37 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 38 | .. versionadded:: 3.9 |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 39 | |
| 40 | The vectorcall protocol was introduced in :pep:`590` as an additional protocol |
| 41 | for making calls more efficient. |
| 42 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 43 | As rule of thumb, CPython will prefer the vectorcall for internal calls |
| 44 | if the callable supports it. However, this is not a hard rule. |
| 45 | Additionally, some third-party extensions use *tp_call* directly |
| 46 | (rather than using :c:func:`PyObject_Call`). |
| 47 | Therefore, a class supporting vectorcall must also implement |
| 48 | :c:member:`~PyTypeObject.tp_call`. |
| 49 | Moreover, the callable must behave the same |
| 50 | regardless of which protocol is used. |
| 51 | The recommended way to achieve this is by setting |
| 52 | :c:member:`~PyTypeObject.tp_call` to :c:func:`PyVectorcall_Call`. |
| 53 | This bears repeating: |
| 54 | |
| 55 | .. warning:: |
| 56 | |
| 57 | A class supporting vectorcall **must** also implement |
| 58 | :c:member:`~PyTypeObject.tp_call` with the same semantics. |
| 59 | |
| 60 | A class should not implement vectorcall if that would be slower |
| 61 | than *tp_call*. For example, if the callee needs to convert |
| 62 | the arguments to an args tuple and kwargs dict anyway, then there is no point |
| 63 | in implementing vectorcall. |
| 64 | |
| 65 | Classes can implement the vectorcall protocol by enabling the |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 66 | :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag and setting |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 67 | :c:member:`~PyTypeObject.tp_vectorcall_offset` to the offset inside the |
| 68 | object structure where a *vectorcallfunc* appears. |
| 69 | This is a pointer to a function with the following signature: |
| 70 | |
| 71 | .. c:type:: PyObject *(*vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) |
| 72 | |
| 73 | - *callable* is the object being called. |
| 74 | - *args* is a C array consisting of the positional arguments followed by the |
| 75 | values of the keyword arguments. |
| 76 | This can be *NULL* if there are no arguments. |
| 77 | - *nargsf* is the number of positional arguments plus possibly the |
| 78 | :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` flag. |
| 79 | To get the actual number of positional arguments from *nargsf*, |
| 80 | use :c:func:`PyVectorcall_NARGS`. |
| 81 | - *kwnames* is a tuple containing the names of the keyword arguments; |
| 82 | in other words, the keys of the kwargs dict. |
| 83 | These names must be strings (instances of ``str`` or a subclass) |
| 84 | and they must be unique. |
| 85 | If there are no keyword arguments, then *kwnames* can instead be *NULL*. |
| 86 | |
| 87 | .. c:var:: PY_VECTORCALL_ARGUMENTS_OFFSET |
| 88 | |
| 89 | If this flag is set in a vectorcall *nargsf* argument, the callee is allowed |
| 90 | to temporarily change ``args[-1]``. In other words, *args* points to |
| 91 | argument 1 (not 0) in the allocated vector. |
| 92 | The callee must restore the value of ``args[-1]`` before returning. |
| 93 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 94 | For :c:func:`PyObject_VectorcallMethod`, this flag means instead that |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 95 | ``args[0]`` may be changed. |
| 96 | |
| 97 | Whenever they can do so cheaply (without additional allocation), callers |
| 98 | are encouraged to use :const:`PY_VECTORCALL_ARGUMENTS_OFFSET`. |
| 99 | Doing so will allow callables such as bound methods to make their onward |
| 100 | calls (which include a prepended *self* argument) very efficiently. |
| 101 | |
| 102 | To call an object that implements vectorcall, use a :ref:`call API <capi-call>` |
| 103 | function as with any other callable. |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 104 | :c:func:`PyObject_Vectorcall` will usually be most efficient. |
| 105 | |
| 106 | |
| 107 | .. note:: |
| 108 | |
| 109 | In CPython 3.8, the vectorcall API and related functions were available |
| 110 | provisionally under names with a leading underscore: |
| 111 | ``_PyObject_Vectorcall``, ``_Py_TPFLAGS_HAVE_VECTORCALL``, |
| 112 | ``_PyObject_VectorcallMethod``, ``_PyVectorcall_Function``, |
| 113 | ``_PyObject_CallOneArg``, ``_PyObject_CallMethodNoArgs``, |
| 114 | ``_PyObject_CallMethodOneArg``. |
| 115 | Additionally, ``PyObject_VectorcallDict`` was available as |
| 116 | ``_PyObject_FastCallDict``. |
| 117 | The old names are still defined as aliases of the new, non-underscored names. |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 118 | |
| 119 | |
| 120 | Recursion Control |
| 121 | ................. |
| 122 | |
| 123 | When using *tp_call*, callees do not need to worry about |
| 124 | :ref:`recursion <recursion>`: CPython uses |
| 125 | :c:func:`Py_EnterRecursiveCall` and :c:func:`Py_LeaveRecursiveCall` |
| 126 | for calls made using *tp_call*. |
| 127 | |
| 128 | For efficiency, this is not the case for calls done using vectorcall: |
| 129 | the callee should use *Py_EnterRecursiveCall* and *Py_LeaveRecursiveCall* |
| 130 | if needed. |
| 131 | |
| 132 | |
| 133 | Vectorcall Support API |
| 134 | ...................... |
| 135 | |
| 136 | .. c:function:: Py_ssize_t PyVectorcall_NARGS(size_t nargsf) |
| 137 | |
| 138 | Given a vectorcall *nargsf* argument, return the actual number of |
| 139 | arguments. |
| 140 | Currently equivalent to:: |
| 141 | |
| 142 | (Py_ssize_t)(nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET) |
| 143 | |
| 144 | However, the function ``PyVectorcall_NARGS`` should be used to allow |
| 145 | for future extensions. |
| 146 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 147 | This function is not part of the `limited API <stable>`_. |
| 148 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 149 | .. versionadded:: 3.8 |
| 150 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 151 | .. c:function:: vectorcallfunc PyVectorcall_Function(PyObject *op) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 152 | |
| 153 | If *op* does not support the vectorcall protocol (either because the type |
| 154 | does not or because the specific instance does not), return *NULL*. |
| 155 | Otherwise, return the vectorcall function pointer stored in *op*. |
| 156 | This function never raises an exception. |
| 157 | |
| 158 | This is mostly useful to check whether or not *op* supports vectorcall, |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 159 | which can be done by checking ``PyVectorcall_Function(op) != NULL``. |
| 160 | |
| 161 | This function is not part of the `limited API <stable>`_. |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 162 | |
| 163 | .. versionadded:: 3.8 |
| 164 | |
| 165 | .. c:function:: PyObject* PyVectorcall_Call(PyObject *callable, PyObject *tuple, PyObject *dict) |
| 166 | |
| 167 | Call *callable*'s :c:type:`vectorcallfunc` with positional and keyword |
| 168 | arguments given in a tuple and dict, respectively. |
| 169 | |
| 170 | This is a specialized function, intended to be put in the |
| 171 | :c:member:`~PyTypeObject.tp_call` slot or be used in an implementation of ``tp_call``. |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 172 | It does not check the :const:`Py_TPFLAGS_HAVE_VECTORCALL` flag |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 173 | and it does not fall back to ``tp_call``. |
| 174 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 175 | This function is not part of the `limited API <stable>`_. |
| 176 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 177 | .. versionadded:: 3.8 |
| 178 | |
| 179 | |
| 180 | .. _capi-call: |
| 181 | |
| 182 | Object Calling API |
| 183 | ------------------ |
| 184 | |
| 185 | Various functions are available for calling a Python object. |
| 186 | Each converts its arguments to a convention supported by the called object – |
| 187 | either *tp_call* or vectorcall. |
| 188 | In order to do as litle conversion as possible, pick one that best fits |
| 189 | the format of data you have available. |
| 190 | |
| 191 | The following table summarizes the available functions; |
| 192 | please see individual documentation for details. |
| 193 | |
| 194 | +------------------------------------------+------------------+--------------------+---------------+ |
| 195 | | Function | callable | args | kwargs | |
| 196 | +==========================================+==================+====================+===============+ |
| 197 | | :c:func:`PyObject_Call` | ``PyObject *`` | tuple | dict/``NULL`` | |
| 198 | +------------------------------------------+------------------+--------------------+---------------+ |
| 199 | | :c:func:`PyObject_CallNoArgs` | ``PyObject *`` | --- | --- | |
| 200 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 201 | | :c:func:`PyObject_CallOneArg` | ``PyObject *`` | 1 object | --- | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 202 | +------------------------------------------+------------------+--------------------+---------------+ |
| 203 | | :c:func:`PyObject_CallObject` | ``PyObject *`` | tuple/``NULL`` | --- | |
| 204 | +------------------------------------------+------------------+--------------------+---------------+ |
| 205 | | :c:func:`PyObject_CallFunction` | ``PyObject *`` | format | --- | |
| 206 | +------------------------------------------+------------------+--------------------+---------------+ |
| 207 | | :c:func:`PyObject_CallMethod` | obj + ``char*`` | format | --- | |
| 208 | +------------------------------------------+------------------+--------------------+---------------+ |
| 209 | | :c:func:`PyObject_CallFunctionObjArgs` | ``PyObject *`` | variadic | --- | |
| 210 | +------------------------------------------+------------------+--------------------+---------------+ |
| 211 | | :c:func:`PyObject_CallMethodObjArgs` | obj + name | variadic | --- | |
| 212 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 213 | | :c:func:`PyObject_CallMethodNoArgs` | obj + name | --- | --- | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 214 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 215 | | :c:func:`PyObject_CallMethodOneArg` | obj + name | 1 object | --- | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 216 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 217 | | :c:func:`PyObject_Vectorcall` | ``PyObject *`` | vectorcall | vectorcall | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 218 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 219 | | :c:func:`PyObject_VectorcallDict` | ``PyObject *`` | vectorcall | dict/``NULL`` | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 220 | +------------------------------------------+------------------+--------------------+---------------+ |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 221 | | :c:func:`PyObject_VectorcallMethod` | arg + name | vectorcall | vectorcall | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 222 | +------------------------------------------+------------------+--------------------+---------------+ |
| 223 | |
| 224 | |
| 225 | .. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs) |
| 226 | |
| 227 | Call a callable Python object *callable*, with arguments given by the |
| 228 | tuple *args*, and named arguments given by the dictionary *kwargs*. |
| 229 | |
| 230 | *args* must not be *NULL*; use an empty tuple if no arguments are needed. |
| 231 | If no named arguments are needed, *kwargs* can be *NULL*. |
| 232 | |
| 233 | Return the result of the call on success, or raise an exception and return |
| 234 | *NULL* on failure. |
| 235 | |
| 236 | This is the equivalent of the Python expression: |
| 237 | ``callable(*args, **kwargs)``. |
| 238 | |
| 239 | |
| 240 | .. c:function:: PyObject* PyObject_CallNoArgs(PyObject *callable) |
| 241 | |
| 242 | Call a callable Python object *callable* without any arguments. It is the |
| 243 | most efficient way to call a callable Python object without any argument. |
| 244 | |
| 245 | Return the result of the call on success, or raise an exception and return |
| 246 | *NULL* on failure. |
| 247 | |
| 248 | .. versionadded:: 3.9 |
| 249 | |
| 250 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 251 | .. c:function:: PyObject* PyObject_CallOneArg(PyObject *callable, PyObject *arg) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 252 | |
| 253 | Call a callable Python object *callable* with exactly 1 positional argument |
| 254 | *arg* and no keyword arguments. |
| 255 | |
| 256 | Return the result of the call on success, or raise an exception and return |
| 257 | *NULL* on failure. |
| 258 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 259 | This function is not part of the `limited API <stable>`_. |
| 260 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 261 | .. versionadded:: 3.9 |
| 262 | |
| 263 | |
| 264 | .. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args) |
| 265 | |
| 266 | Call a callable Python object *callable*, with arguments given by the |
| 267 | tuple *args*. If no arguments are needed, then *args* can be *NULL*. |
| 268 | |
| 269 | Return the result of the call on success, or raise an exception and return |
| 270 | *NULL* on failure. |
| 271 | |
| 272 | This is the equivalent of the Python expression: ``callable(*args)``. |
| 273 | |
| 274 | |
| 275 | .. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...) |
| 276 | |
| 277 | Call a callable Python object *callable*, with a variable number of C arguments. |
| 278 | The C arguments are described using a :c:func:`Py_BuildValue` style format |
| 279 | string. The format can be *NULL*, indicating that no arguments are provided. |
| 280 | |
| 281 | Return the result of the call on success, or raise an exception and return |
| 282 | *NULL* on failure. |
| 283 | |
| 284 | This is the equivalent of the Python expression: ``callable(*args)``. |
| 285 | |
| 286 | Note that if you only pass :c:type:`PyObject \*` args, |
| 287 | :c:func:`PyObject_CallFunctionObjArgs` is a faster alternative. |
| 288 | |
| 289 | .. versionchanged:: 3.4 |
| 290 | The type of *format* was changed from ``char *``. |
| 291 | |
| 292 | |
| 293 | .. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) |
| 294 | |
| 295 | Call the method named *name* of object *obj* with a variable number of C |
| 296 | arguments. The C arguments are described by a :c:func:`Py_BuildValue` format |
| 297 | string that should produce a tuple. |
| 298 | |
| 299 | The format can be *NULL*, indicating that no arguments are provided. |
| 300 | |
| 301 | Return the result of the call on success, or raise an exception and return |
| 302 | *NULL* on failure. |
| 303 | |
| 304 | This is the equivalent of the Python expression: |
| 305 | ``obj.name(arg1, arg2, ...)``. |
| 306 | |
| 307 | Note that if you only pass :c:type:`PyObject \*` args, |
| 308 | :c:func:`PyObject_CallMethodObjArgs` is a faster alternative. |
| 309 | |
| 310 | .. versionchanged:: 3.4 |
| 311 | The types of *name* and *format* were changed from ``char *``. |
| 312 | |
| 313 | |
| 314 | .. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL) |
| 315 | |
| 316 | Call a callable Python object *callable*, with a variable number of |
| 317 | :c:type:`PyObject \*` arguments. The arguments are provided as a variable number |
| 318 | of parameters followed by *NULL*. |
| 319 | |
| 320 | Return the result of the call on success, or raise an exception and return |
| 321 | *NULL* on failure. |
| 322 | |
| 323 | This is the equivalent of the Python expression: |
| 324 | ``callable(arg1, arg2, ...)``. |
| 325 | |
| 326 | |
| 327 | .. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ..., NULL) |
| 328 | |
| 329 | Call a method of the Python object *obj*, where the name of the method is given as a |
| 330 | Python string object in *name*. It is called with a variable number of |
| 331 | :c:type:`PyObject \*` arguments. The arguments are provided as a variable number |
| 332 | of parameters followed by *NULL*. |
| 333 | |
| 334 | Return the result of the call on success, or raise an exception and return |
| 335 | *NULL* on failure. |
| 336 | |
| 337 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 338 | .. c:function:: PyObject* PyObject_CallMethodNoArgs(PyObject *obj, PyObject *name) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 339 | |
| 340 | Call a method of the Python object *obj* without arguments, |
| 341 | where the name of the method is given as a Python string object in *name*. |
| 342 | |
| 343 | Return the result of the call on success, or raise an exception and return |
| 344 | *NULL* on failure. |
| 345 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 346 | This function is not part of the `limited API <stable>`_. |
| 347 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 348 | .. versionadded:: 3.9 |
| 349 | |
| 350 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 351 | .. c:function:: PyObject* PyObject_CallMethodOneArg(PyObject *obj, PyObject *name, PyObject *arg) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 352 | |
| 353 | Call a method of the Python object *obj* with a single positional argument |
| 354 | *arg*, where the name of the method is given as a Python string object in |
| 355 | *name*. |
| 356 | |
| 357 | Return the result of the call on success, or raise an exception and return |
| 358 | *NULL* on failure. |
| 359 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 360 | This function is not part of the `limited API <stable>`_. |
| 361 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 362 | .. versionadded:: 3.9 |
| 363 | |
| 364 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 365 | .. c:function:: PyObject* PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 366 | |
| 367 | Call a callable Python object *callable*. |
| 368 | The arguments are the same as for :c:type:`vectorcallfunc`. |
| 369 | If *callable* supports vectorcall_, this directly calls |
| 370 | the vectorcall function stored in *callable*. |
| 371 | |
| 372 | Return the result of the call on success, or raise an exception and return |
| 373 | *NULL* on failure. |
| 374 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 375 | This function is not part of the `limited API <stable>`_. |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 376 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 377 | .. versionadded:: 3.9 |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 378 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 379 | .. c:function:: PyObject* PyObject_VectorcallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 380 | |
| 381 | Call *callable* with positional arguments passed exactly as in the vectorcall_ protocol, |
| 382 | but with keyword arguments passed as a dictionary *kwdict*. |
| 383 | The *args* array contains only the positional arguments. |
| 384 | |
| 385 | Regardless of which protocol is used internally, |
| 386 | a conversion of arguments needs to be done. |
| 387 | Therefore, this function should only be used if the caller |
| 388 | already has a dictionary ready to use for the keyword arguments, |
| 389 | but not a tuple for the positional arguments. |
| 390 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 391 | This function is not part of the `limited API <stable>`_. |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 392 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 393 | .. versionadded:: 3.9 |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 394 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 395 | .. c:function:: PyObject* PyObject_VectorcallMethod(PyObject *name, PyObject *const *args, size_t nargsf, PyObject *kwnames) |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 396 | |
| 397 | Call a method using the vectorcall calling convention. The name of the method |
| 398 | is given as a Python string *name*. The object whose method is called is |
| 399 | *args[0]*, and the *args* array starting at *args[1]* represents the arguments |
| 400 | of the call. There must be at least one positional argument. |
| 401 | *nargsf* is the number of positional arguments including *args[0]*, |
| 402 | plus :const:`PY_VECTORCALL_ARGUMENTS_OFFSET` if the value of ``args[0]`` may |
| 403 | temporarily be changed. Keyword arguments can be passed just like in |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 404 | :c:func:`PyObject_Vectorcall`. |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 405 | |
| 406 | If the object has the :const:`Py_TPFLAGS_METHOD_DESCRIPTOR` feature, |
| 407 | this will call the unbound method object with the full |
| 408 | *args* vector as arguments. |
| 409 | |
| 410 | Return the result of the call on success, or raise an exception and return |
| 411 | *NULL* on failure. |
| 412 | |
Petr Viktorin | 3f563ce | 2020-02-06 15:48:27 +0100 | [diff] [blame^] | 413 | This function is not part of the `limited API <stable>`_. |
| 414 | |
Jeroen Demeyer | 9a13a38 | 2019-11-12 14:08:00 +0100 | [diff] [blame] | 415 | .. versionadded:: 3.9 |
| 416 | |
| 417 | |
| 418 | Call Support API |
| 419 | ---------------- |
| 420 | |
| 421 | .. c:function:: int PyCallable_Check(PyObject *o) |
| 422 | |
| 423 | Determine if the object *o* is callable. Return ``1`` if the object is callable |
| 424 | and ``0`` otherwise. This function always succeeds. |