mirror of https://github.com/python/cpython
Docs: Fix Sphinx annotations in Doc/library/ctypes.rst (#107672)
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
This commit is contained in:
parent
ecb05e0b98
commit
71a7c96ffe
|
@ -110,6 +110,8 @@ nitpick_ignore = [
|
||||||
('c:type', 'uintptr_t'),
|
('c:type', 'uintptr_t'),
|
||||||
('c:type', 'va_list'),
|
('c:type', 'va_list'),
|
||||||
('c:type', 'wchar_t'),
|
('c:type', 'wchar_t'),
|
||||||
|
('c:type', '__int64'),
|
||||||
|
('c:type', 'unsigned __int64'),
|
||||||
# Standard C structures
|
# Standard C structures
|
||||||
('c:struct', 'in6_addr'),
|
('c:struct', 'in6_addr'),
|
||||||
('c:struct', 'in_addr'),
|
('c:struct', 'in_addr'),
|
||||||
|
|
|
@ -72,8 +72,9 @@ Windows appends the usual ``.dll`` file suffix automatically.
|
||||||
|
|
||||||
On Linux, it is required to specify the filename *including* the extension to
|
On Linux, it is required to specify the filename *including* the extension to
|
||||||
load a library, so attribute access can not be used to load libraries. Either the
|
load a library, so attribute access can not be used to load libraries. Either the
|
||||||
:meth:`LoadLibrary` method of the dll loaders should be used, or you should load
|
:meth:`~LibraryLoader.LoadLibrary` method of the dll loaders should be used,
|
||||||
the library by creating an instance of CDLL by calling the constructor::
|
or you should load the library by creating an instance of CDLL by calling
|
||||||
|
the constructor::
|
||||||
|
|
||||||
>>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX
|
>>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX
|
||||||
<CDLL 'libc.so.6', handle ... at ...>
|
<CDLL 'libc.so.6', handle ... at ...>
|
||||||
|
@ -333,7 +334,7 @@ property::
|
||||||
10 b'Hi\x00lo\x00\x00\x00\x00\x00'
|
10 b'Hi\x00lo\x00\x00\x00\x00\x00'
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
The :func:`create_string_buffer` function replaces the old :func:`c_buffer`
|
The :func:`create_string_buffer` function replaces the old :func:`!c_buffer`
|
||||||
function (which is still available as an alias). To create a mutable memory
|
function (which is still available as an alias). To create a mutable memory
|
||||||
block containing unicode characters of the C type :c:type:`wchar_t`, use the
|
block containing unicode characters of the C type :c:type:`wchar_t`, use the
|
||||||
:func:`create_unicode_buffer` function.
|
:func:`create_unicode_buffer` function.
|
||||||
|
@ -383,15 +384,15 @@ as calling functions with a fixed number of parameters. On some platforms, and i
|
||||||
particular ARM64 for Apple Platforms, the calling convention for variadic functions
|
particular ARM64 for Apple Platforms, the calling convention for variadic functions
|
||||||
is different than that for regular functions.
|
is different than that for regular functions.
|
||||||
|
|
||||||
On those platforms it is required to specify the *argtypes* attribute for the
|
On those platforms it is required to specify the :attr:`~_FuncPtr.argtypes`
|
||||||
regular, non-variadic, function arguments:
|
attribute for the regular, non-variadic, function arguments:
|
||||||
|
|
||||||
.. code-block:: python3
|
.. code-block:: python3
|
||||||
|
|
||||||
libc.printf.argtypes = [ctypes.c_char_p]
|
libc.printf.argtypes = [ctypes.c_char_p]
|
||||||
|
|
||||||
Because specifying the attribute does not inhibit portability it is advised to always
|
Because specifying the attribute does not inhibit portability it is advised to always
|
||||||
specify ``argtypes`` for all variadic functions.
|
specify :attr:`~_FuncPtr.argtypes` for all variadic functions.
|
||||||
|
|
||||||
|
|
||||||
.. _ctypes-calling-functions-with-own-custom-data-types:
|
.. _ctypes-calling-functions-with-own-custom-data-types:
|
||||||
|
@ -401,7 +402,7 @@ Calling functions with your own custom data types
|
||||||
|
|
||||||
You can also customize :mod:`ctypes` argument conversion to allow instances of
|
You can also customize :mod:`ctypes` argument conversion to allow instances of
|
||||||
your own classes be used as function arguments. :mod:`ctypes` looks for an
|
your own classes be used as function arguments. :mod:`ctypes` looks for an
|
||||||
:attr:`_as_parameter_` attribute and uses this as the function argument. Of
|
:attr:`!_as_parameter_` attribute and uses this as the function argument. Of
|
||||||
course, it must be one of integer, string, or bytes::
|
course, it must be one of integer, string, or bytes::
|
||||||
|
|
||||||
>>> class Bottles:
|
>>> class Bottles:
|
||||||
|
@ -414,7 +415,7 @@ course, it must be one of integer, string, or bytes::
|
||||||
19
|
19
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
If you don't want to store the instance's data in the :attr:`_as_parameter_`
|
If you don't want to store the instance's data in the :attr:`!_as_parameter_`
|
||||||
instance variable, you could define a :class:`property` which makes the
|
instance variable, you could define a :class:`property` which makes the
|
||||||
attribute available on request.
|
attribute available on request.
|
||||||
|
|
||||||
|
@ -425,9 +426,9 @@ Specifying the required argument types (function prototypes)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
It is possible to specify the required argument types of functions exported from
|
It is possible to specify the required argument types of functions exported from
|
||||||
DLLs by setting the :attr:`argtypes` attribute.
|
DLLs by setting the :attr:`~_FuncPtr.argtypes` attribute.
|
||||||
|
|
||||||
:attr:`argtypes` must be a sequence of C data types (the ``printf`` function is
|
:attr:`~_FuncPtr.argtypes` must be a sequence of C data types (the :func:`!printf` function is
|
||||||
probably not a good example here, because it takes a variable number and
|
probably not a good example here, because it takes a variable number and
|
||||||
different types of parameters depending on the format string, on the other hand
|
different types of parameters depending on the format string, on the other hand
|
||||||
this is quite handy to experiment with this feature)::
|
this is quite handy to experiment with this feature)::
|
||||||
|
@ -451,14 +452,14 @@ prototype for a C function), and tries to convert the arguments to valid types::
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
If you have defined your own classes which you pass to function calls, you have
|
If you have defined your own classes which you pass to function calls, you have
|
||||||
to implement a :meth:`from_param` class method for them to be able to use them
|
to implement a :meth:`~_CData.from_param` class method for them to be able to use them
|
||||||
in the :attr:`argtypes` sequence. The :meth:`from_param` class method receives
|
in the :attr:`~_FuncPtr.argtypes` sequence. The :meth:`~_CData.from_param` class method receives
|
||||||
the Python object passed to the function call, it should do a typecheck or
|
the Python object passed to the function call, it should do a typecheck or
|
||||||
whatever is needed to make sure this object is acceptable, and then return the
|
whatever is needed to make sure this object is acceptable, and then return the
|
||||||
object itself, its :attr:`_as_parameter_` attribute, or whatever you want to
|
object itself, its :attr:`!_as_parameter_` attribute, or whatever you want to
|
||||||
pass as the C function argument in this case. Again, the result should be an
|
pass as the C function argument in this case. Again, the result should be an
|
||||||
integer, string, bytes, a :mod:`ctypes` instance, or an object with an
|
integer, string, bytes, a :mod:`ctypes` instance, or an object with an
|
||||||
:attr:`_as_parameter_` attribute.
|
:attr:`!_as_parameter_` attribute.
|
||||||
|
|
||||||
|
|
||||||
.. _ctypes-return-types:
|
.. _ctypes-return-types:
|
||||||
|
@ -478,13 +479,13 @@ By default functions are assumed to return the C :c:expr:`int` type. Other
|
||||||
return types can be specified by setting the :attr:`restype` attribute of the
|
return types can be specified by setting the :attr:`restype` attribute of the
|
||||||
function object.
|
function object.
|
||||||
|
|
||||||
The C prototype of ``time()`` is ``time_t time(time_t *)``. Because :c:type:`time_t`
|
The C prototype of :c:func:`time` is ``time_t time(time_t *)``. Because :c:type:`time_t`
|
||||||
might be of a different type than the default return type ``int``, you should
|
might be of a different type than the default return type :c:expr:`int`, you should
|
||||||
specify the ``restype``::
|
specify the :attr:`!restype` attribute::
|
||||||
|
|
||||||
>>> libc.time.restype = c_time_t
|
>>> libc.time.restype = c_time_t
|
||||||
|
|
||||||
The argument types can be specified using ``argtypes``::
|
The argument types can be specified using :attr:`~_FuncPtr.argtypes`::
|
||||||
|
|
||||||
>>> libc.time.argtypes = (POINTER(c_time_t),)
|
>>> libc.time.argtypes = (POINTER(c_time_t),)
|
||||||
|
|
||||||
|
@ -493,7 +494,7 @@ To call the function with a ``NULL`` pointer as first argument, use ``None``::
|
||||||
>>> print(libc.time(None)) # doctest: +SKIP
|
>>> print(libc.time(None)) # doctest: +SKIP
|
||||||
1150640792
|
1150640792
|
||||||
|
|
||||||
Here is a more advanced example, it uses the ``strchr`` function, which expects
|
Here is a more advanced example, it uses the :func:`strchr` function, which expects
|
||||||
a string pointer and a char, and returns a pointer to a string::
|
a string pointer and a char, and returns a pointer to a string::
|
||||||
|
|
||||||
>>> strchr = libc.strchr
|
>>> strchr = libc.strchr
|
||||||
|
@ -506,8 +507,8 @@ a string pointer and a char, and returns a pointer to a string::
|
||||||
None
|
None
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
If you want to avoid the ``ord("x")`` calls above, you can set the
|
If you want to avoid the :func:`ord("x") <ord>` calls above, you can set the
|
||||||
:attr:`argtypes` attribute, and the second argument will be converted from a
|
:attr:`~_FuncPtr.argtypes` attribute, and the second argument will be converted from a
|
||||||
single character Python bytes object into a C char:
|
single character Python bytes object into a C char:
|
||||||
|
|
||||||
.. doctest::
|
.. doctest::
|
||||||
|
@ -853,7 +854,7 @@ Type conversions
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Usually, ctypes does strict type checking. This means, if you have
|
Usually, ctypes does strict type checking. This means, if you have
|
||||||
``POINTER(c_int)`` in the :attr:`argtypes` list of a function or as the type of
|
``POINTER(c_int)`` in the :attr:`~_FuncPtr.argtypes` list of a function or as the type of
|
||||||
a member field in a structure definition, only instances of exactly the same
|
a member field in a structure definition, only instances of exactly the same
|
||||||
type are accepted. There are some exceptions to this rule, where ctypes accepts
|
type are accepted. There are some exceptions to this rule, where ctypes accepts
|
||||||
other objects. For example, you can pass compatible array instances instead of
|
other objects. For example, you can pass compatible array instances instead of
|
||||||
|
@ -874,7 +875,7 @@ pointer types. So, for ``POINTER(c_int)``, ctypes accepts an array of c_int::
|
||||||
>>>
|
>>>
|
||||||
|
|
||||||
In addition, if a function argument is explicitly declared to be a pointer type
|
In addition, if a function argument is explicitly declared to be a pointer type
|
||||||
(such as ``POINTER(c_int)``) in :attr:`argtypes`, an object of the pointed
|
(such as ``POINTER(c_int)``) in :attr:`_FuncPtr.argtypes`, an object of the pointed
|
||||||
type (``c_int`` in this case) can be passed to the function. ctypes will apply
|
type (``c_int`` in this case) can be passed to the function. ctypes will apply
|
||||||
the required :func:`byref` conversion in this case automatically.
|
the required :func:`byref` conversion in this case automatically.
|
||||||
|
|
||||||
|
@ -1437,7 +1438,7 @@ function exported by these libraries, and reacquired afterwards.
|
||||||
All these classes can be instantiated by calling them with at least one
|
All these classes can be instantiated by calling them with at least one
|
||||||
argument, the pathname of the shared library. If you have an existing handle to
|
argument, the pathname of the shared library. If you have an existing handle to
|
||||||
an already loaded shared library, it can be passed as the ``handle`` named
|
an already loaded shared library, it can be passed as the ``handle`` named
|
||||||
parameter, otherwise the underlying platforms ``dlopen`` or ``LoadLibrary``
|
parameter, otherwise the underlying platforms :c:func:`!dlopen` or :c:func:`LoadLibrary`
|
||||||
function is used to load the library into the process, and to get a handle to
|
function is used to load the library into the process, and to get a handle to
|
||||||
it.
|
it.
|
||||||
|
|
||||||
|
@ -1522,8 +1523,8 @@ underscore to not clash with exported function names:
|
||||||
|
|
||||||
Shared libraries can also be loaded by using one of the prefabricated objects,
|
Shared libraries can also be loaded by using one of the prefabricated objects,
|
||||||
which are instances of the :class:`LibraryLoader` class, either by calling the
|
which are instances of the :class:`LibraryLoader` class, either by calling the
|
||||||
:meth:`LoadLibrary` method, or by retrieving the library as attribute of the
|
:meth:`~LibraryLoader.LoadLibrary` method, or by retrieving the library as
|
||||||
loader instance.
|
attribute of the loader instance.
|
||||||
|
|
||||||
|
|
||||||
.. class:: LibraryLoader(dlltype)
|
.. class:: LibraryLoader(dlltype)
|
||||||
|
@ -1639,14 +1640,14 @@ They are instances of a private class:
|
||||||
unspecified arguments as well.
|
unspecified arguments as well.
|
||||||
|
|
||||||
When a foreign function is called, each actual argument is passed to the
|
When a foreign function is called, each actual argument is passed to the
|
||||||
:meth:`from_param` class method of the items in the :attr:`argtypes`
|
:meth:`~_CData.from_param` class method of the items in the :attr:`argtypes`
|
||||||
tuple, this method allows adapting the actual argument to an object that
|
tuple, this method allows adapting the actual argument to an object that
|
||||||
the foreign function accepts. For example, a :class:`c_char_p` item in
|
the foreign function accepts. For example, a :class:`c_char_p` item in
|
||||||
the :attr:`argtypes` tuple will convert a string passed as argument into
|
the :attr:`argtypes` tuple will convert a string passed as argument into
|
||||||
a bytes object using ctypes conversion rules.
|
a bytes object using ctypes conversion rules.
|
||||||
|
|
||||||
New: It is now possible to put items in argtypes which are not ctypes
|
New: It is now possible to put items in argtypes which are not ctypes
|
||||||
types, but each item must have a :meth:`from_param` method which returns a
|
types, but each item must have a :meth:`~_CData.from_param` method which returns a
|
||||||
value usable as argument (integer, string, ctypes instance). This allows
|
value usable as argument (integer, string, ctypes instance). This allows
|
||||||
defining adapters that can adapt custom objects as function parameters.
|
defining adapters that can adapt custom objects as function parameters.
|
||||||
|
|
||||||
|
@ -1770,12 +1771,12 @@ different ways, depending on the type and number of the parameters in the call:
|
||||||
|
|
||||||
COM methods use a special calling convention: They require a pointer to
|
COM methods use a special calling convention: They require a pointer to
|
||||||
the COM interface as first argument, in addition to those parameters that
|
the COM interface as first argument, in addition to those parameters that
|
||||||
are specified in the :attr:`argtypes` tuple.
|
are specified in the :attr:`~_FuncPtr.argtypes` tuple.
|
||||||
|
|
||||||
The optional *paramflags* parameter creates foreign function wrappers with much
|
The optional *paramflags* parameter creates foreign function wrappers with much
|
||||||
more functionality than the features described above.
|
more functionality than the features described above.
|
||||||
|
|
||||||
*paramflags* must be a tuple of the same length as :attr:`argtypes`.
|
*paramflags* must be a tuple of the same length as :attr:`~_FuncPtr.argtypes`.
|
||||||
|
|
||||||
Each item in this tuple contains further information about a parameter, it must
|
Each item in this tuple contains further information about a parameter, it must
|
||||||
be a tuple containing one, two, or three items.
|
be a tuple containing one, two, or three items.
|
||||||
|
@ -2157,8 +2158,8 @@ Data types
|
||||||
|
|
||||||
This method adapts *obj* to a ctypes type. It is called with the actual
|
This method adapts *obj* to a ctypes type. It is called with the actual
|
||||||
object used in a foreign function call when the type is present in the
|
object used in a foreign function call when the type is present in the
|
||||||
foreign function's :attr:`argtypes` tuple; it must return an object that
|
foreign function's :attr:`~_FuncPtr.argtypes` tuple;
|
||||||
can be used as a function call parameter.
|
it must return an object that can be used as a function call parameter.
|
||||||
|
|
||||||
All ctypes data types have a default implementation of this classmethod
|
All ctypes data types have a default implementation of this classmethod
|
||||||
that normally returns *obj* if that is an instance of the type. Some
|
that normally returns *obj* if that is an instance of the type. Some
|
||||||
|
|
Loading…
Reference in New Issue