add files
This commit is contained in:
39
python-3.7.4-docs-html/_sources/about.rst.txt
Normal file
39
python-3.7.4-docs-html/_sources/about.rst.txt
Normal file
@@ -0,0 +1,39 @@
|
||||
=====================
|
||||
About these documents
|
||||
=====================
|
||||
|
||||
|
||||
These documents are generated from `reStructuredText`_ sources by `Sphinx`_, a
|
||||
document processor specifically written for the Python documentation.
|
||||
|
||||
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
|
||||
.. _Sphinx: http://sphinx-doc.org/
|
||||
|
||||
.. In the online version of these documents, you can submit comments and suggest
|
||||
changes directly on the documentation pages.
|
||||
|
||||
Development of the documentation and its toolchain is an entirely volunteer
|
||||
effort, just like Python itself. If you want to contribute, please take a
|
||||
look at the :ref:`reporting-bugs` page for information on how to do so. New
|
||||
volunteers are always welcome!
|
||||
|
||||
Many thanks go to:
|
||||
|
||||
* Fred L. Drake, Jr., the creator of the original Python documentation toolset
|
||||
and writer of much of the content;
|
||||
* the `Docutils <http://docutils.sourceforge.net/>`_ project for creating
|
||||
reStructuredText and the Docutils suite;
|
||||
* Fredrik Lundh for his `Alternative Python Reference
|
||||
<http://effbot.org/zone/pyref.htm>`_ project from which Sphinx got many good
|
||||
ideas.
|
||||
|
||||
|
||||
Contributors to the Python Documentation
|
||||
----------------------------------------
|
||||
|
||||
Many people have contributed to the Python language, the Python standard
|
||||
library, and the Python documentation. See :source:`Misc/ACKS` in the Python
|
||||
source distribution for a partial list of contributors.
|
||||
|
||||
It is only with the input and contributions of the Python community
|
||||
that Python has such wonderful documentation -- Thank You!
|
||||
92
python-3.7.4-docs-html/_sources/bugs.rst.txt
Normal file
92
python-3.7.4-docs-html/_sources/bugs.rst.txt
Normal file
@@ -0,0 +1,92 @@
|
||||
.. _reporting-bugs:
|
||||
|
||||
*****************
|
||||
Dealing with Bugs
|
||||
*****************
|
||||
|
||||
Python is a mature programming language which has established a reputation for
|
||||
stability. In order to maintain this reputation, the developers would like to
|
||||
know of any deficiencies you find in Python.
|
||||
|
||||
It can be sometimes faster to fix bugs yourself and contribute patches to
|
||||
Python as it streamlines the process and involves less people. Learn how to
|
||||
:ref:`contribute <contributing-to-python>`.
|
||||
|
||||
Documentation bugs
|
||||
==================
|
||||
|
||||
If you find a bug in this documentation or would like to propose an improvement,
|
||||
please submit a bug report on the :ref:`tracker <using-the-tracker>`. If you
|
||||
have a suggestion on how to fix it, include that as well.
|
||||
|
||||
If you're short on time, you can also email documentation bug reports to
|
||||
docs@python.org (behavioral bugs can be sent to python-list@python.org).
|
||||
'docs@' is a mailing list run by volunteers; your request will be noticed,
|
||||
though it may take a while to be processed.
|
||||
|
||||
.. seealso::
|
||||
`Documentation bugs`_ on the Python issue tracker
|
||||
|
||||
.. _using-the-tracker:
|
||||
|
||||
Using the Python issue tracker
|
||||
==============================
|
||||
|
||||
Bug reports for Python itself should be submitted via the Python Bug Tracker
|
||||
(https://bugs.python.org/). The bug tracker offers a Web form which allows
|
||||
pertinent information to be entered and submitted to the developers.
|
||||
|
||||
The first step in filing a report is to determine whether the problem has
|
||||
already been reported. The advantage in doing so, aside from saving the
|
||||
developers time, is that you learn what has been done to fix it; it may be that
|
||||
the problem has already been fixed for the next release, or additional
|
||||
information is needed (in which case you are welcome to provide it if you can!).
|
||||
To do this, search the bug database using the search box on the top of the page.
|
||||
|
||||
If the problem you're reporting is not already in the bug tracker, go back to
|
||||
the Python Bug Tracker and log in. If you don't already have a tracker account,
|
||||
select the "Register" link or, if you use OpenID, one of the OpenID provider
|
||||
logos in the sidebar. It is not possible to submit a bug report anonymously.
|
||||
|
||||
Being now logged in, you can submit a bug. Select the "Create New" link in the
|
||||
sidebar to open the bug reporting form.
|
||||
|
||||
The submission form has a number of fields. For the "Title" field, enter a
|
||||
*very* short description of the problem; less than ten words is good. In the
|
||||
"Type" field, select the type of your problem; also select the "Component" and
|
||||
"Versions" to which the bug relates.
|
||||
|
||||
In the "Comment" field, describe the problem in detail, including what you
|
||||
expected to happen and what did happen. Be sure to include whether any
|
||||
extension modules were involved, and what hardware and software platform you
|
||||
were using (including version information as appropriate).
|
||||
|
||||
Each bug report will be assigned to a developer who will determine what needs to
|
||||
be done to correct the problem. You will receive an update each time action is
|
||||
taken on the bug.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`How to Report Bugs Effectively <https://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_
|
||||
Article which goes into some detail about how to create a useful bug report.
|
||||
This describes what kind of information is useful and why it is useful.
|
||||
|
||||
`Bug Writing Guidelines <https://developer.mozilla.org/en-US/docs/Mozilla/QA/Bug_writing_guidelines>`_
|
||||
Information about writing a good bug report. Some of this is specific to the
|
||||
Mozilla project, but describes general good practices.
|
||||
|
||||
.. _contributing-to-python:
|
||||
|
||||
Getting started contributing to Python yourself
|
||||
===============================================
|
||||
|
||||
Beyond just reporting bugs that you find, you are also welcome to submit
|
||||
patches to fix them. You can find more information on how to get started
|
||||
patching Python in the `Python Developer's Guide`_. If you have questions,
|
||||
the `core-mentorship mailing list`_ is a friendly place to get answers to
|
||||
any and all questions pertaining to the process of fixing issues in Python.
|
||||
|
||||
.. _Documentation bugs: https://bugs.python.org/issue?@filter=status&@filter=components&components=4&status=1&@columns=id,activity,title,status&@sort=-activity
|
||||
.. _Python Developer's Guide: https://devguide.python.org/
|
||||
.. _core-mentorship mailing list: https://mail.python.org/mailman3/lists/core-mentorship.python.org/
|
||||
26
python-3.7.4-docs-html/_sources/c-api/abstract.rst.txt
Normal file
26
python-3.7.4-docs-html/_sources/c-api/abstract.rst.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _abstract:
|
||||
|
||||
**********************
|
||||
Abstract Objects Layer
|
||||
**********************
|
||||
|
||||
The functions in this chapter interact with Python objects regardless of their
|
||||
type, or with wide classes of object types (e.g. all numerical types, or all
|
||||
sequence types). When used on object types for which they do not apply, they
|
||||
will raise a Python exception.
|
||||
|
||||
It is not possible to use these functions on objects that are not properly
|
||||
initialized, such as a list object that has been created by :c:func:`PyList_New`,
|
||||
but whose items have not been set to some non-\ ``NULL`` value yet.
|
||||
|
||||
.. toctree::
|
||||
|
||||
object.rst
|
||||
number.rst
|
||||
sequence.rst
|
||||
mapping.rst
|
||||
iter.rst
|
||||
buffer.rst
|
||||
objbuffer.rst
|
||||
71
python-3.7.4-docs-html/_sources/c-api/allocation.rst.txt
Normal file
71
python-3.7.4-docs-html/_sources/c-api/allocation.rst.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _allocating-objects:
|
||||
|
||||
Allocating Objects on the Heap
|
||||
==============================
|
||||
|
||||
|
||||
.. c:function:: PyObject* _PyObject_New(PyTypeObject *type)
|
||||
|
||||
|
||||
.. c:function:: PyVarObject* _PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_Init(PyObject *op, PyTypeObject *type)
|
||||
|
||||
Initialize a newly-allocated object *op* with its type and initial
|
||||
reference. Returns the initialized object. If *type* indicates that the
|
||||
object participates in the cyclic garbage detector, it is added to the
|
||||
detector's set of observed objects. Other fields of the object are not
|
||||
affected.
|
||||
|
||||
|
||||
.. c:function:: PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
|
||||
|
||||
This does everything :c:func:`PyObject_Init` does, and also initializes the
|
||||
length information for a variable-size object.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyObject_New(TYPE, PyTypeObject *type)
|
||||
|
||||
Allocate a new Python object using the C structure type *TYPE* and the
|
||||
Python type object *type*. Fields not defined by the Python object header
|
||||
are not initialized; the object's reference count will be one. The size of
|
||||
the memory allocation is determined from the :c:member:`~PyTypeObject.tp_basicsize` field of
|
||||
the type object.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)
|
||||
|
||||
Allocate a new Python object using the C structure type *TYPE* and the
|
||||
Python type object *type*. Fields not defined by the Python object header
|
||||
are not initialized. The allocated memory allows for the *TYPE* structure
|
||||
plus *size* fields of the size given by the :c:member:`~PyTypeObject.tp_itemsize` field of
|
||||
*type*. This is useful for implementing objects like tuples, which are
|
||||
able to determine their size at construction time. Embedding the array of
|
||||
fields into the same allocation decreases the number of allocations,
|
||||
improving the memory management efficiency.
|
||||
|
||||
|
||||
.. c:function:: void PyObject_Del(void *op)
|
||||
|
||||
Releases memory allocated to an object using :c:func:`PyObject_New` or
|
||||
:c:func:`PyObject_NewVar`. This is normally called from the
|
||||
:c:member:`~PyTypeObject.tp_dealloc` handler specified in the object's type. The fields of
|
||||
the object should not be accessed after this call as the memory is no
|
||||
longer a valid Python object.
|
||||
|
||||
|
||||
.. c:var:: PyObject _Py_NoneStruct
|
||||
|
||||
Object which is visible in Python as ``None``. This should only be accessed
|
||||
using the :c:macro:`Py_None` macro, which evaluates to a pointer to this
|
||||
object.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:c:func:`PyModule_Create`
|
||||
To allocate and create extension modules.
|
||||
|
||||
39
python-3.7.4-docs-html/_sources/c-api/apiabiversion.rst.txt
Normal file
39
python-3.7.4-docs-html/_sources/c-api/apiabiversion.rst.txt
Normal file
@@ -0,0 +1,39 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _apiabiversion:
|
||||
|
||||
***********************
|
||||
API and ABI Versioning
|
||||
***********************
|
||||
|
||||
``PY_VERSION_HEX`` is the Python version number encoded in a single integer.
|
||||
|
||||
For example if the ``PY_VERSION_HEX`` is set to ``0x030401a2``, the underlying
|
||||
version information can be found by treating it as a 32 bit number in
|
||||
the following manner:
|
||||
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
| Bytes | Bits (big endian order) | Meaning |
|
||||
+=======+=========================+================================================+
|
||||
| ``1`` | ``1-8`` | ``PY_MAJOR_VERSION`` (the ``3`` in |
|
||||
| | | ``3.4.1a2``) |
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
| ``2`` | ``9-16`` | ``PY_MINOR_VERSION`` (the ``4`` in |
|
||||
| | | ``3.4.1a2``) |
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
| ``3`` | ``17-24`` | ``PY_MICRO_VERSION`` (the ``1`` in |
|
||||
| | | ``3.4.1a2``) |
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
| ``4`` | ``25-28`` | ``PY_RELEASE_LEVEL`` (``0xA`` for alpha, |
|
||||
| | | ``0xB`` for beta, ``0xC`` for release |
|
||||
| | | candidate and ``0xF`` for final), in this |
|
||||
| | | case it is alpha. |
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
| | ``29-32`` | ``PY_RELEASE_SERIAL`` (the ``2`` in |
|
||||
| | | ``3.4.1a2``, zero for final releases) |
|
||||
+-------+-------------------------+------------------------------------------------+
|
||||
|
||||
Thus ``3.4.1a2`` is hexversion ``0x030401a2``.
|
||||
|
||||
All the given macros are defined in :source:`Include/patchlevel.h`.
|
||||
|
||||
676
python-3.7.4-docs-html/_sources/c-api/arg.rst.txt
Normal file
676
python-3.7.4-docs-html/_sources/c-api/arg.rst.txt
Normal file
@@ -0,0 +1,676 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _arg-parsing:
|
||||
|
||||
Parsing arguments and building values
|
||||
=====================================
|
||||
|
||||
These functions are useful when creating your own extensions functions and
|
||||
methods. Additional information and examples are available in
|
||||
:ref:`extending-index`.
|
||||
|
||||
The first three of these functions described, :c:func:`PyArg_ParseTuple`,
|
||||
:c:func:`PyArg_ParseTupleAndKeywords`, and :c:func:`PyArg_Parse`, all use *format
|
||||
strings* which are used to tell the function about the expected arguments. The
|
||||
format strings use the same syntax for each of these functions.
|
||||
|
||||
-----------------
|
||||
Parsing arguments
|
||||
-----------------
|
||||
|
||||
A format string consists of zero or more "format units." A format unit
|
||||
describes one Python object; it is usually a single character or a parenthesized
|
||||
sequence of format units. With a few exceptions, a format unit that is not a
|
||||
parenthesized sequence normally corresponds to a single address argument to
|
||||
these functions. In the following description, the quoted form is the format
|
||||
unit; the entry in (round) parentheses is the Python object type that matches
|
||||
the format unit; and the entry in [square] brackets is the type of the C
|
||||
variable(s) whose address should be passed.
|
||||
|
||||
Strings and buffers
|
||||
-------------------
|
||||
|
||||
These formats allow accessing an object as a contiguous chunk of memory.
|
||||
You don't have to provide raw storage for the returned unicode or bytes
|
||||
area.
|
||||
|
||||
In general, when a format sets a pointer to a buffer, the buffer is
|
||||
managed by the corresponding Python object, and the buffer shares
|
||||
the lifetime of this object. You won't have to release any memory yourself.
|
||||
The only exceptions are ``es``, ``es#``, ``et`` and ``et#``.
|
||||
|
||||
However, when a :c:type:`Py_buffer` structure gets filled, the underlying
|
||||
buffer is locked so that the caller can subsequently use the buffer even
|
||||
inside a :c:type:`Py_BEGIN_ALLOW_THREADS` block without the risk of mutable data
|
||||
being resized or destroyed. As a result, **you have to call**
|
||||
:c:func:`PyBuffer_Release` after you have finished processing the data (or
|
||||
in any early abort case).
|
||||
|
||||
Unless otherwise stated, buffers are not NUL-terminated.
|
||||
|
||||
Some formats require a read-only :term:`bytes-like object`, and set a
|
||||
pointer instead of a buffer structure. They work by checking that
|
||||
the object's :c:member:`PyBufferProcs.bf_releasebuffer` field is *NULL*,
|
||||
which disallows mutable objects such as :class:`bytearray`.
|
||||
|
||||
.. note::
|
||||
|
||||
For all ``#`` variants of formats (``s#``, ``y#``, etc.), the type of
|
||||
the length argument (int or :c:type:`Py_ssize_t`) is controlled by
|
||||
defining the macro :c:macro:`PY_SSIZE_T_CLEAN` before including
|
||||
:file:`Python.h`. If the macro was defined, length is a
|
||||
:c:type:`Py_ssize_t` rather than an :c:type:`int`. This behavior will change
|
||||
in a future Python version to only support :c:type:`Py_ssize_t` and
|
||||
drop :c:type:`int` support. It is best to always define :c:macro:`PY_SSIZE_T_CLEAN`.
|
||||
|
||||
|
||||
``s`` (:class:`str`) [const char \*]
|
||||
Convert a Unicode object to a C pointer to a character string.
|
||||
A pointer to an existing string is stored in the character pointer
|
||||
variable whose address you pass. The C string is NUL-terminated.
|
||||
The Python string must not contain embedded null code points; if it does,
|
||||
a :exc:`ValueError` exception is raised. Unicode objects are converted
|
||||
to C strings using ``'utf-8'`` encoding. If this conversion fails, a
|
||||
:exc:`UnicodeError` is raised.
|
||||
|
||||
.. note::
|
||||
This format does not accept :term:`bytes-like objects
|
||||
<bytes-like object>`. If you want to accept
|
||||
filesystem paths and convert them to C character strings, it is
|
||||
preferable to use the ``O&`` format with :c:func:`PyUnicode_FSConverter`
|
||||
as *converter*.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Previously, :exc:`TypeError` was raised when embedded null code points
|
||||
were encountered in the Python string.
|
||||
|
||||
``s*`` (:class:`str` or :term:`bytes-like object`) [Py_buffer]
|
||||
This format accepts Unicode objects as well as bytes-like objects.
|
||||
It fills a :c:type:`Py_buffer` structure provided by the caller.
|
||||
In this case the resulting C string may contain embedded NUL bytes.
|
||||
Unicode objects are converted to C strings using ``'utf-8'`` encoding.
|
||||
|
||||
``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \*, int or :c:type:`Py_ssize_t`]
|
||||
Like ``s*``, except that it doesn't accept mutable objects.
|
||||
The result is stored into two C variables,
|
||||
the first one a pointer to a C string, the second one its length.
|
||||
The string may contain embedded null bytes. Unicode objects are converted
|
||||
to C strings using ``'utf-8'`` encoding.
|
||||
|
||||
``z`` (:class:`str` or ``None``) [const char \*]
|
||||
Like ``s``, but the Python object may also be ``None``, in which case the C
|
||||
pointer is set to *NULL*.
|
||||
|
||||
``z*`` (:class:`str`, :term:`bytes-like object` or ``None``) [Py_buffer]
|
||||
Like ``s*``, but the Python object may also be ``None``, in which case the
|
||||
``buf`` member of the :c:type:`Py_buffer` structure is set to *NULL*.
|
||||
|
||||
``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) [const char \*, int]
|
||||
Like ``s#``, but the Python object may also be ``None``, in which case the C
|
||||
pointer is set to *NULL*.
|
||||
|
||||
``y`` (read-only :term:`bytes-like object`) [const char \*]
|
||||
This format converts a bytes-like object to a C pointer to a character
|
||||
string; it does not accept Unicode objects. The bytes buffer must not
|
||||
contain embedded null bytes; if it does, a :exc:`ValueError`
|
||||
exception is raised.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Previously, :exc:`TypeError` was raised when embedded null bytes were
|
||||
encountered in the bytes buffer.
|
||||
|
||||
``y*`` (:term:`bytes-like object`) [Py_buffer]
|
||||
This variant on ``s*`` doesn't accept Unicode objects, only
|
||||
bytes-like objects. **This is the recommended way to accept
|
||||
binary data.**
|
||||
|
||||
``y#`` (read-only :term:`bytes-like object`) [const char \*, int]
|
||||
This variant on ``s#`` doesn't accept Unicode objects, only bytes-like
|
||||
objects.
|
||||
|
||||
``S`` (:class:`bytes`) [PyBytesObject \*]
|
||||
Requires that the Python object is a :class:`bytes` object, without
|
||||
attempting any conversion. Raises :exc:`TypeError` if the object is not
|
||||
a bytes object. The C variable may also be declared as :c:type:`PyObject\*`.
|
||||
|
||||
``Y`` (:class:`bytearray`) [PyByteArrayObject \*]
|
||||
Requires that the Python object is a :class:`bytearray` object, without
|
||||
attempting any conversion. Raises :exc:`TypeError` if the object is not
|
||||
a :class:`bytearray` object. The C variable may also be declared as :c:type:`PyObject\*`.
|
||||
|
||||
``u`` (:class:`str`) [const Py_UNICODE \*]
|
||||
Convert a Python Unicode object to a C pointer to a NUL-terminated buffer of
|
||||
Unicode characters. You must pass the address of a :c:type:`Py_UNICODE`
|
||||
pointer variable, which will be filled with the pointer to an existing
|
||||
Unicode buffer. Please note that the width of a :c:type:`Py_UNICODE`
|
||||
character depends on compilation options (it is either 16 or 32 bits).
|
||||
The Python string must not contain embedded null code points; if it does,
|
||||
a :exc:`ValueError` exception is raised.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Previously, :exc:`TypeError` was raised when embedded null code points
|
||||
were encountered in the Python string.
|
||||
|
||||
.. deprecated-removed:: 3.3 4.0
|
||||
Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
|
||||
:c:func:`PyUnicode_AsWideCharString`.
|
||||
|
||||
``u#`` (:class:`str`) [const Py_UNICODE \*, int]
|
||||
This variant on ``u`` stores into two C variables, the first one a pointer to a
|
||||
Unicode data buffer, the second one its length. This variant allows
|
||||
null code points.
|
||||
|
||||
.. deprecated-removed:: 3.3 4.0
|
||||
Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
|
||||
:c:func:`PyUnicode_AsWideCharString`.
|
||||
|
||||
``Z`` (:class:`str` or ``None``) [const Py_UNICODE \*]
|
||||
Like ``u``, but the Python object may also be ``None``, in which case the
|
||||
:c:type:`Py_UNICODE` pointer is set to *NULL*.
|
||||
|
||||
.. deprecated-removed:: 3.3 4.0
|
||||
Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
|
||||
:c:func:`PyUnicode_AsWideCharString`.
|
||||
|
||||
``Z#`` (:class:`str` or ``None``) [const Py_UNICODE \*, int]
|
||||
Like ``u#``, but the Python object may also be ``None``, in which case the
|
||||
:c:type:`Py_UNICODE` pointer is set to *NULL*.
|
||||
|
||||
.. deprecated-removed:: 3.3 4.0
|
||||
Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
|
||||
:c:func:`PyUnicode_AsWideCharString`.
|
||||
|
||||
``U`` (:class:`str`) [PyObject \*]
|
||||
Requires that the Python object is a Unicode object, without attempting
|
||||
any conversion. Raises :exc:`TypeError` if the object is not a Unicode
|
||||
object. The C variable may also be declared as :c:type:`PyObject\*`.
|
||||
|
||||
``w*`` (read-write :term:`bytes-like object`) [Py_buffer]
|
||||
This format accepts any object which implements the read-write buffer
|
||||
interface. It fills a :c:type:`Py_buffer` structure provided by the caller.
|
||||
The buffer may contain embedded null bytes. The caller have to call
|
||||
:c:func:`PyBuffer_Release` when it is done with the buffer.
|
||||
|
||||
``es`` (:class:`str`) [const char \*encoding, char \*\*buffer]
|
||||
This variant on ``s`` is used for encoding Unicode into a character buffer.
|
||||
It only works for encoded data without embedded NUL bytes.
|
||||
|
||||
This format requires two arguments. The first is only used as input, and
|
||||
must be a :c:type:`const char\*` which points to the name of an encoding as a
|
||||
NUL-terminated string, or *NULL*, in which case ``'utf-8'`` encoding is used.
|
||||
An exception is raised if the named encoding is not known to Python. The
|
||||
second argument must be a :c:type:`char\*\*`; the value of the pointer it
|
||||
references will be set to a buffer with the contents of the argument text.
|
||||
The text will be encoded in the encoding specified by the first argument.
|
||||
|
||||
:c:func:`PyArg_ParseTuple` will allocate a buffer of the needed size, copy the
|
||||
encoded data into this buffer and adjust *\*buffer* to reference the newly
|
||||
allocated storage. The caller is responsible for calling :c:func:`PyMem_Free` to
|
||||
free the allocated buffer after use.
|
||||
|
||||
``et`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char \*encoding, char \*\*buffer]
|
||||
Same as ``es`` except that byte string objects are passed through without
|
||||
recoding them. Instead, the implementation assumes that the byte string object uses
|
||||
the encoding passed in as parameter.
|
||||
|
||||
``es#`` (:class:`str`) [const char \*encoding, char \*\*buffer, int \*buffer_length]
|
||||
This variant on ``s#`` is used for encoding Unicode into a character buffer.
|
||||
Unlike the ``es`` format, this variant allows input data which contains NUL
|
||||
characters.
|
||||
|
||||
It requires three arguments. The first is only used as input, and must be a
|
||||
:c:type:`const char\*` which points to the name of an encoding as a
|
||||
NUL-terminated string, or *NULL*, in which case ``'utf-8'`` encoding is used.
|
||||
An exception is raised if the named encoding is not known to Python. The
|
||||
second argument must be a :c:type:`char\*\*`; the value of the pointer it
|
||||
references will be set to a buffer with the contents of the argument text.
|
||||
The text will be encoded in the encoding specified by the first argument.
|
||||
The third argument must be a pointer to an integer; the referenced integer
|
||||
will be set to the number of bytes in the output buffer.
|
||||
|
||||
There are two modes of operation:
|
||||
|
||||
If *\*buffer* points a *NULL* pointer, the function will allocate a buffer of
|
||||
the needed size, copy the encoded data into this buffer and set *\*buffer* to
|
||||
reference the newly allocated storage. The caller is responsible for calling
|
||||
:c:func:`PyMem_Free` to free the allocated buffer after usage.
|
||||
|
||||
If *\*buffer* points to a non-*NULL* pointer (an already allocated buffer),
|
||||
:c:func:`PyArg_ParseTuple` will use this location as the buffer and interpret the
|
||||
initial value of *\*buffer_length* as the buffer size. It will then copy the
|
||||
encoded data into the buffer and NUL-terminate it. If the buffer is not large
|
||||
enough, a :exc:`ValueError` will be set.
|
||||
|
||||
In both cases, *\*buffer_length* is set to the length of the encoded data
|
||||
without the trailing NUL byte.
|
||||
|
||||
``et#`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char \*encoding, char \*\*buffer, int \*buffer_length]
|
||||
Same as ``es#`` except that byte string objects are passed through without recoding
|
||||
them. Instead, the implementation assumes that the byte string object uses the
|
||||
encoding passed in as parameter.
|
||||
|
||||
Numbers
|
||||
-------
|
||||
|
||||
``b`` (:class:`int`) [unsigned char]
|
||||
Convert a nonnegative Python integer to an unsigned tiny int, stored in a C
|
||||
:c:type:`unsigned char`.
|
||||
|
||||
``B`` (:class:`int`) [unsigned char]
|
||||
Convert a Python integer to a tiny int without overflow checking, stored in a C
|
||||
:c:type:`unsigned char`.
|
||||
|
||||
``h`` (:class:`int`) [short int]
|
||||
Convert a Python integer to a C :c:type:`short int`.
|
||||
|
||||
``H`` (:class:`int`) [unsigned short int]
|
||||
Convert a Python integer to a C :c:type:`unsigned short int`, without overflow
|
||||
checking.
|
||||
|
||||
``i`` (:class:`int`) [int]
|
||||
Convert a Python integer to a plain C :c:type:`int`.
|
||||
|
||||
``I`` (:class:`int`) [unsigned int]
|
||||
Convert a Python integer to a C :c:type:`unsigned int`, without overflow
|
||||
checking.
|
||||
|
||||
``l`` (:class:`int`) [long int]
|
||||
Convert a Python integer to a C :c:type:`long int`.
|
||||
|
||||
``k`` (:class:`int`) [unsigned long]
|
||||
Convert a Python integer to a C :c:type:`unsigned long` without
|
||||
overflow checking.
|
||||
|
||||
``L`` (:class:`int`) [long long]
|
||||
Convert a Python integer to a C :c:type:`long long`.
|
||||
|
||||
``K`` (:class:`int`) [unsigned long long]
|
||||
Convert a Python integer to a C :c:type:`unsigned long long`
|
||||
without overflow checking.
|
||||
|
||||
``n`` (:class:`int`) [Py_ssize_t]
|
||||
Convert a Python integer to a C :c:type:`Py_ssize_t`.
|
||||
|
||||
``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char]
|
||||
Convert a Python byte, represented as a :class:`bytes` or
|
||||
:class:`bytearray` object of length 1, to a C :c:type:`char`.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
Allow :class:`bytearray` objects.
|
||||
|
||||
``C`` (:class:`str` of length 1) [int]
|
||||
Convert a Python character, represented as a :class:`str` object of
|
||||
length 1, to a C :c:type:`int`.
|
||||
|
||||
``f`` (:class:`float`) [float]
|
||||
Convert a Python floating point number to a C :c:type:`float`.
|
||||
|
||||
``d`` (:class:`float`) [double]
|
||||
Convert a Python floating point number to a C :c:type:`double`.
|
||||
|
||||
``D`` (:class:`complex`) [Py_complex]
|
||||
Convert a Python complex number to a C :c:type:`Py_complex` structure.
|
||||
|
||||
Other objects
|
||||
-------------
|
||||
|
||||
``O`` (object) [PyObject \*]
|
||||
Store a Python object (without any conversion) in a C object pointer. The C
|
||||
program thus receives the actual object that was passed. The object's reference
|
||||
count is not increased. The pointer stored is not *NULL*.
|
||||
|
||||
``O!`` (object) [*typeobject*, PyObject \*]
|
||||
Store a Python object in a C object pointer. This is similar to ``O``, but
|
||||
takes two C arguments: the first is the address of a Python type object, the
|
||||
second is the address of the C variable (of type :c:type:`PyObject\*`) into which
|
||||
the object pointer is stored. If the Python object does not have the required
|
||||
type, :exc:`TypeError` is raised.
|
||||
|
||||
.. _o_ampersand:
|
||||
|
||||
``O&`` (object) [*converter*, *anything*]
|
||||
Convert a Python object to a C variable through a *converter* function. This
|
||||
takes two arguments: the first is a function, the second is the address of a C
|
||||
variable (of arbitrary type), converted to :c:type:`void \*`. The *converter*
|
||||
function in turn is called as follows::
|
||||
|
||||
status = converter(object, address);
|
||||
|
||||
where *object* is the Python object to be converted and *address* is the
|
||||
:c:type:`void\*` argument that was passed to the :c:func:`PyArg_Parse\*` function.
|
||||
The returned *status* should be ``1`` for a successful conversion and ``0`` if
|
||||
the conversion has failed. When the conversion fails, the *converter* function
|
||||
should raise an exception and leave the content of *address* unmodified.
|
||||
|
||||
If the *converter* returns ``Py_CLEANUP_SUPPORTED``, it may get called a
|
||||
second time if the argument parsing eventually fails, giving the converter a
|
||||
chance to release any memory that it had already allocated. In this second
|
||||
call, the *object* parameter will be NULL; *address* will have the same value
|
||||
as in the original call.
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
``Py_CLEANUP_SUPPORTED`` was added.
|
||||
|
||||
``p`` (:class:`bool`) [int]
|
||||
Tests the value passed in for truth (a boolean **p**\ redicate) and converts
|
||||
the result to its equivalent C true/false integer value.
|
||||
Sets the int to ``1`` if the expression was true and ``0`` if it was false.
|
||||
This accepts any valid Python value. See :ref:`truth` for more
|
||||
information about how Python tests values for truth.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
``(items)`` (:class:`tuple`) [*matching-items*]
|
||||
The object must be a Python sequence whose length is the number of format units
|
||||
in *items*. The C arguments must correspond to the individual format units in
|
||||
*items*. Format units for sequences may be nested.
|
||||
|
||||
It is possible to pass "long" integers (integers whose value exceeds the
|
||||
platform's :const:`LONG_MAX`) however no proper range checking is done --- the
|
||||
most significant bits are silently truncated when the receiving field is too
|
||||
small to receive the value (actually, the semantics are inherited from downcasts
|
||||
in C --- your mileage may vary).
|
||||
|
||||
A few other characters have a meaning in a format string. These may not occur
|
||||
inside nested parentheses. They are:
|
||||
|
||||
``|``
|
||||
Indicates that the remaining arguments in the Python argument list are optional.
|
||||
The C variables corresponding to optional arguments should be initialized to
|
||||
their default value --- when an optional argument is not specified,
|
||||
:c:func:`PyArg_ParseTuple` does not touch the contents of the corresponding C
|
||||
variable(s).
|
||||
|
||||
``$``
|
||||
:c:func:`PyArg_ParseTupleAndKeywords` only:
|
||||
Indicates that the remaining arguments in the Python argument list are
|
||||
keyword-only. Currently, all keyword-only arguments must also be optional
|
||||
arguments, so ``|`` must always be specified before ``$`` in the format
|
||||
string.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
``:``
|
||||
The list of format units ends here; the string after the colon is used as the
|
||||
function name in error messages (the "associated value" of the exception that
|
||||
:c:func:`PyArg_ParseTuple` raises).
|
||||
|
||||
``;``
|
||||
The list of format units ends here; the string after the semicolon is used as
|
||||
the error message *instead* of the default error message. ``:`` and ``;``
|
||||
mutually exclude each other.
|
||||
|
||||
Note that any Python object references which are provided to the caller are
|
||||
*borrowed* references; do not decrement their reference count!
|
||||
|
||||
Additional arguments passed to these functions must be addresses of variables
|
||||
whose type is determined by the format string; these are used to store values
|
||||
from the input tuple. There are a few cases, as described in the list of format
|
||||
units above, where these parameters are used as input values; they should match
|
||||
what is specified for the corresponding format unit in that case.
|
||||
|
||||
For the conversion to succeed, the *arg* object must match the format
|
||||
and the format must be exhausted. On success, the
|
||||
:c:func:`PyArg_Parse\*` functions return true, otherwise they return
|
||||
false and raise an appropriate exception. When the
|
||||
:c:func:`PyArg_Parse\*` functions fail due to conversion failure in one
|
||||
of the format units, the variables at the addresses corresponding to that
|
||||
and the following format units are left untouched.
|
||||
|
||||
API Functions
|
||||
-------------
|
||||
|
||||
.. c:function:: int PyArg_ParseTuple(PyObject *args, const char *format, ...)
|
||||
|
||||
Parse the parameters of a function that takes only positional parameters into
|
||||
local variables. Returns true on success; on failure, it returns false and
|
||||
raises the appropriate exception.
|
||||
|
||||
|
||||
.. c:function:: int PyArg_VaParse(PyObject *args, const char *format, va_list vargs)
|
||||
|
||||
Identical to :c:func:`PyArg_ParseTuple`, except that it accepts a va_list rather
|
||||
than a variable number of arguments.
|
||||
|
||||
|
||||
.. c:function:: int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], ...)
|
||||
|
||||
Parse the parameters of a function that takes both positional and keyword
|
||||
parameters into local variables. The *keywords* argument is a
|
||||
*NULL*-terminated array of keyword parameter names. Empty names denote
|
||||
:ref:`positional-only parameters <positional-only_parameter>`.
|
||||
Returns true on success; on failure, it returns false and raises the
|
||||
appropriate exception.
|
||||
|
||||
.. versionchanged:: 3.6
|
||||
Added support for :ref:`positional-only parameters
|
||||
<positional-only_parameter>`.
|
||||
|
||||
|
||||
.. c:function:: int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], va_list vargs)
|
||||
|
||||
Identical to :c:func:`PyArg_ParseTupleAndKeywords`, except that it accepts a
|
||||
va_list rather than a variable number of arguments.
|
||||
|
||||
|
||||
.. c:function:: int PyArg_ValidateKeywordArguments(PyObject *)
|
||||
|
||||
Ensure that the keys in the keywords argument dictionary are strings. This
|
||||
is only needed if :c:func:`PyArg_ParseTupleAndKeywords` is not used, since the
|
||||
latter already does this check.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
|
||||
.. XXX deprecated, will be removed
|
||||
.. c:function:: int PyArg_Parse(PyObject *args, const char *format, ...)
|
||||
|
||||
Function used to deconstruct the argument lists of "old-style" functions ---
|
||||
these are functions which use the :const:`METH_OLDARGS` parameter parsing
|
||||
method, which has been removed in Python 3. This is not recommended for use
|
||||
in parameter parsing in new code, and most code in the standard interpreter
|
||||
has been modified to no longer use this for that purpose. It does remain a
|
||||
convenient way to decompose other tuples, however, and may continue to be
|
||||
used for that purpose.
|
||||
|
||||
|
||||
.. c:function:: int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
|
||||
|
||||
A simpler form of parameter retrieval which does not use a format string to
|
||||
specify the types of the arguments. Functions which use this method to retrieve
|
||||
their parameters should be declared as :const:`METH_VARARGS` in function or
|
||||
method tables. The tuple containing the actual parameters should be passed as
|
||||
*args*; it must actually be a tuple. The length of the tuple must be at least
|
||||
*min* and no more than *max*; *min* and *max* may be equal. Additional
|
||||
arguments must be passed to the function, each of which should be a pointer to a
|
||||
:c:type:`PyObject\*` variable; these will be filled in with the values from
|
||||
*args*; they will contain borrowed references. The variables which correspond
|
||||
to optional parameters not given by *args* will not be filled in; these should
|
||||
be initialized by the caller. This function returns true on success and false if
|
||||
*args* is not a tuple or contains the wrong number of elements; an exception
|
||||
will be set if there was a failure.
|
||||
|
||||
This is an example of the use of this function, taken from the sources for the
|
||||
:mod:`_weakref` helper module for weak references::
|
||||
|
||||
static PyObject *
|
||||
weakref_ref(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *object;
|
||||
PyObject *callback = NULL;
|
||||
PyObject *result = NULL;
|
||||
|
||||
if (PyArg_UnpackTuple(args, "ref", 1, 2, &object, &callback)) {
|
||||
result = PyWeakref_NewRef(object, callback);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
The call to :c:func:`PyArg_UnpackTuple` in this example is entirely equivalent to
|
||||
this call to :c:func:`PyArg_ParseTuple`::
|
||||
|
||||
PyArg_ParseTuple(args, "O|O:ref", &object, &callback)
|
||||
|
||||
|
||||
---------------
|
||||
Building values
|
||||
---------------
|
||||
|
||||
.. c:function:: PyObject* Py_BuildValue(const char *format, ...)
|
||||
|
||||
Create a new value based on a format string similar to those accepted by the
|
||||
:c:func:`PyArg_Parse\*` family of functions and a sequence of values. Returns
|
||||
the value or *NULL* in the case of an error; an exception will be raised if
|
||||
*NULL* is returned.
|
||||
|
||||
:c:func:`Py_BuildValue` does not always build a tuple. It builds a tuple only if
|
||||
its format string contains two or more format units. If the format string is
|
||||
empty, it returns ``None``; if it contains exactly one format unit, it returns
|
||||
whatever object is described by that format unit. To force it to return a tuple
|
||||
of size 0 or one, parenthesize the format string.
|
||||
|
||||
When memory buffers are passed as parameters to supply data to build objects, as
|
||||
for the ``s`` and ``s#`` formats, the required data is copied. Buffers provided
|
||||
by the caller are never referenced by the objects created by
|
||||
:c:func:`Py_BuildValue`. In other words, if your code invokes :c:func:`malloc`
|
||||
and passes the allocated memory to :c:func:`Py_BuildValue`, your code is
|
||||
responsible for calling :c:func:`free` for that memory once
|
||||
:c:func:`Py_BuildValue` returns.
|
||||
|
||||
In the following description, the quoted form is the format unit; the entry in
|
||||
(round) parentheses is the Python object type that the format unit will return;
|
||||
and the entry in [square] brackets is the type of the C value(s) to be passed.
|
||||
|
||||
The characters space, tab, colon and comma are ignored in format strings (but
|
||||
not within format units such as ``s#``). This can be used to make long format
|
||||
strings a tad more readable.
|
||||
|
||||
``s`` (:class:`str` or ``None``) [const char \*]
|
||||
Convert a null-terminated C string to a Python :class:`str` object using ``'utf-8'``
|
||||
encoding. If the C string pointer is *NULL*, ``None`` is used.
|
||||
|
||||
``s#`` (:class:`str` or ``None``) [const char \*, int]
|
||||
Convert a C string and its length to a Python :class:`str` object using ``'utf-8'``
|
||||
encoding. If the C string pointer is *NULL*, the length is ignored and
|
||||
``None`` is returned.
|
||||
|
||||
``y`` (:class:`bytes`) [const char \*]
|
||||
This converts a C string to a Python :class:`bytes` object. If the C
|
||||
string pointer is *NULL*, ``None`` is returned.
|
||||
|
||||
``y#`` (:class:`bytes`) [const char \*, int]
|
||||
This converts a C string and its lengths to a Python object. If the C
|
||||
string pointer is *NULL*, ``None`` is returned.
|
||||
|
||||
``z`` (:class:`str` or ``None``) [const char \*]
|
||||
Same as ``s``.
|
||||
|
||||
``z#`` (:class:`str` or ``None``) [const char \*, int]
|
||||
Same as ``s#``.
|
||||
|
||||
``u`` (:class:`str`) [const wchar_t \*]
|
||||
Convert a null-terminated :c:type:`wchar_t` buffer of Unicode (UTF-16 or UCS-4)
|
||||
data to a Python Unicode object. If the Unicode buffer pointer is *NULL*,
|
||||
``None`` is returned.
|
||||
|
||||
``u#`` (:class:`str`) [const wchar_t \*, int]
|
||||
Convert a Unicode (UTF-16 or UCS-4) data buffer and its length to a Python
|
||||
Unicode object. If the Unicode buffer pointer is *NULL*, the length is ignored
|
||||
and ``None`` is returned.
|
||||
|
||||
``U`` (:class:`str` or ``None``) [const char \*]
|
||||
Same as ``s``.
|
||||
|
||||
``U#`` (:class:`str` or ``None``) [const char \*, int]
|
||||
Same as ``s#``.
|
||||
|
||||
``i`` (:class:`int`) [int]
|
||||
Convert a plain C :c:type:`int` to a Python integer object.
|
||||
|
||||
``b`` (:class:`int`) [char]
|
||||
Convert a plain C :c:type:`char` to a Python integer object.
|
||||
|
||||
``h`` (:class:`int`) [short int]
|
||||
Convert a plain C :c:type:`short int` to a Python integer object.
|
||||
|
||||
``l`` (:class:`int`) [long int]
|
||||
Convert a C :c:type:`long int` to a Python integer object.
|
||||
|
||||
``B`` (:class:`int`) [unsigned char]
|
||||
Convert a C :c:type:`unsigned char` to a Python integer object.
|
||||
|
||||
``H`` (:class:`int`) [unsigned short int]
|
||||
Convert a C :c:type:`unsigned short int` to a Python integer object.
|
||||
|
||||
``I`` (:class:`int`) [unsigned int]
|
||||
Convert a C :c:type:`unsigned int` to a Python integer object.
|
||||
|
||||
``k`` (:class:`int`) [unsigned long]
|
||||
Convert a C :c:type:`unsigned long` to a Python integer object.
|
||||
|
||||
``L`` (:class:`int`) [long long]
|
||||
Convert a C :c:type:`long long` to a Python integer object.
|
||||
|
||||
``K`` (:class:`int`) [unsigned long long]
|
||||
Convert a C :c:type:`unsigned long long` to a Python integer object.
|
||||
|
||||
``n`` (:class:`int`) [Py_ssize_t]
|
||||
Convert a C :c:type:`Py_ssize_t` to a Python integer.
|
||||
|
||||
``c`` (:class:`bytes` of length 1) [char]
|
||||
Convert a C :c:type:`int` representing a byte to a Python :class:`bytes` object of
|
||||
length 1.
|
||||
|
||||
``C`` (:class:`str` of length 1) [int]
|
||||
Convert a C :c:type:`int` representing a character to Python :class:`str`
|
||||
object of length 1.
|
||||
|
||||
``d`` (:class:`float`) [double]
|
||||
Convert a C :c:type:`double` to a Python floating point number.
|
||||
|
||||
``f`` (:class:`float`) [float]
|
||||
Convert a C :c:type:`float` to a Python floating point number.
|
||||
|
||||
``D`` (:class:`complex`) [Py_complex \*]
|
||||
Convert a C :c:type:`Py_complex` structure to a Python complex number.
|
||||
|
||||
``O`` (object) [PyObject \*]
|
||||
Pass a Python object untouched (except for its reference count, which is
|
||||
incremented by one). If the object passed in is a *NULL* pointer, it is assumed
|
||||
that this was caused because the call producing the argument found an error and
|
||||
set an exception. Therefore, :c:func:`Py_BuildValue` will return *NULL* but won't
|
||||
raise an exception. If no exception has been raised yet, :exc:`SystemError` is
|
||||
set.
|
||||
|
||||
``S`` (object) [PyObject \*]
|
||||
Same as ``O``.
|
||||
|
||||
``N`` (object) [PyObject \*]
|
||||
Same as ``O``, except it doesn't increment the reference count on the object.
|
||||
Useful when the object is created by a call to an object constructor in the
|
||||
argument list.
|
||||
|
||||
``O&`` (object) [*converter*, *anything*]
|
||||
Convert *anything* to a Python object through a *converter* function. The
|
||||
function is called with *anything* (which should be compatible with :c:type:`void
|
||||
\*`) as its argument and should return a "new" Python object, or *NULL* if an
|
||||
error occurred.
|
||||
|
||||
``(items)`` (:class:`tuple`) [*matching-items*]
|
||||
Convert a sequence of C values to a Python tuple with the same number of items.
|
||||
|
||||
``[items]`` (:class:`list`) [*matching-items*]
|
||||
Convert a sequence of C values to a Python list with the same number of items.
|
||||
|
||||
``{items}`` (:class:`dict`) [*matching-items*]
|
||||
Convert a sequence of C values to a Python dictionary. Each pair of consecutive
|
||||
C values adds one item to the dictionary, serving as key and value,
|
||||
respectively.
|
||||
|
||||
If there is an error in the format string, the :exc:`SystemError` exception is
|
||||
set and *NULL* returned.
|
||||
|
||||
.. c:function:: PyObject* Py_VaBuildValue(const char *format, va_list vargs)
|
||||
|
||||
Identical to :c:func:`Py_BuildValue`, except that it accepts a va_list
|
||||
rather than a variable number of arguments.
|
||||
46
python-3.7.4-docs-html/_sources/c-api/bool.rst.txt
Normal file
46
python-3.7.4-docs-html/_sources/c-api/bool.rst.txt
Normal file
@@ -0,0 +1,46 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _boolobjects:
|
||||
|
||||
Boolean Objects
|
||||
---------------
|
||||
|
||||
Booleans in Python are implemented as a subclass of integers. There are only
|
||||
two booleans, :const:`Py_False` and :const:`Py_True`. As such, the normal
|
||||
creation and deletion functions don't apply to booleans. The following macros
|
||||
are available, however.
|
||||
|
||||
|
||||
.. c:function:: int PyBool_Check(PyObject *o)
|
||||
|
||||
Return true if *o* is of type :c:data:`PyBool_Type`.
|
||||
|
||||
|
||||
.. c:var:: PyObject* Py_False
|
||||
|
||||
The Python ``False`` object. This object has no methods. It needs to be
|
||||
treated just like any other object with respect to reference counts.
|
||||
|
||||
|
||||
.. c:var:: PyObject* Py_True
|
||||
|
||||
The Python ``True`` object. This object has no methods. It needs to be treated
|
||||
just like any other object with respect to reference counts.
|
||||
|
||||
|
||||
.. c:macro:: Py_RETURN_FALSE
|
||||
|
||||
Return :const:`Py_False` from a function, properly incrementing its reference
|
||||
count.
|
||||
|
||||
|
||||
.. c:macro:: Py_RETURN_TRUE
|
||||
|
||||
Return :const:`Py_True` from a function, properly incrementing its reference
|
||||
count.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBool_FromLong(long v)
|
||||
|
||||
Return a new reference to :const:`Py_True` or :const:`Py_False` depending on the
|
||||
truth value of *v*.
|
||||
508
python-3.7.4-docs-html/_sources/c-api/buffer.rst.txt
Normal file
508
python-3.7.4-docs-html/_sources/c-api/buffer.rst.txt
Normal file
@@ -0,0 +1,508 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. index::
|
||||
single: buffer protocol
|
||||
single: buffer interface; (see buffer protocol)
|
||||
single: buffer object; (see buffer protocol)
|
||||
|
||||
.. _bufferobjects:
|
||||
|
||||
Buffer Protocol
|
||||
---------------
|
||||
|
||||
.. sectionauthor:: Greg Stein <gstein@lyra.org>
|
||||
.. sectionauthor:: Benjamin Peterson
|
||||
.. sectionauthor:: Stefan Krah
|
||||
|
||||
|
||||
Certain objects available in Python wrap access to an underlying memory
|
||||
array or *buffer*. Such objects include the built-in :class:`bytes` and
|
||||
:class:`bytearray`, and some extension types like :class:`array.array`.
|
||||
Third-party libraries may define their own types for special purposes, such
|
||||
as image processing or numeric analysis.
|
||||
|
||||
While each of these types have their own semantics, they share the common
|
||||
characteristic of being backed by a possibly large memory buffer. It is
|
||||
then desirable, in some situations, to access that buffer directly and
|
||||
without intermediate copying.
|
||||
|
||||
Python provides such a facility at the C level in the form of the :ref:`buffer
|
||||
protocol <bufferobjects>`. This protocol has two sides:
|
||||
|
||||
.. index:: single: PyBufferProcs
|
||||
|
||||
- on the producer side, a type can export a "buffer interface" which allows
|
||||
objects of that type to expose information about their underlying buffer.
|
||||
This interface is described in the section :ref:`buffer-structs`;
|
||||
|
||||
- on the consumer side, several means are available to obtain a pointer to
|
||||
the raw underlying data of an object (for example a method parameter).
|
||||
|
||||
Simple objects such as :class:`bytes` and :class:`bytearray` expose their
|
||||
underlying buffer in byte-oriented form. Other forms are possible; for example,
|
||||
the elements exposed by an :class:`array.array` can be multi-byte values.
|
||||
|
||||
An example consumer of the buffer interface is the :meth:`~io.BufferedIOBase.write`
|
||||
method of file objects: any object that can export a series of bytes through
|
||||
the buffer interface can be written to a file. While :meth:`write` only
|
||||
needs read-only access to the internal contents of the object passed to it,
|
||||
other methods such as :meth:`~io.BufferedIOBase.readinto` need write access
|
||||
to the contents of their argument. The buffer interface allows objects to
|
||||
selectively allow or reject exporting of read-write and read-only buffers.
|
||||
|
||||
There are two ways for a consumer of the buffer interface to acquire a buffer
|
||||
over a target object:
|
||||
|
||||
* call :c:func:`PyObject_GetBuffer` with the right parameters;
|
||||
|
||||
* call :c:func:`PyArg_ParseTuple` (or one of its siblings) with one of the
|
||||
``y*``, ``w*`` or ``s*`` :ref:`format codes <arg-parsing>`.
|
||||
|
||||
In both cases, :c:func:`PyBuffer_Release` must be called when the buffer
|
||||
isn't needed anymore. Failure to do so could lead to various issues such as
|
||||
resource leaks.
|
||||
|
||||
|
||||
.. _buffer-structure:
|
||||
|
||||
Buffer structure
|
||||
================
|
||||
|
||||
Buffer structures (or simply "buffers") are useful as a way to expose the
|
||||
binary data from another object to the Python programmer. They can also be
|
||||
used as a zero-copy slicing mechanism. Using their ability to reference a
|
||||
block of memory, it is possible to expose any data to the Python programmer
|
||||
quite easily. The memory could be a large, constant array in a C extension,
|
||||
it could be a raw block of memory for manipulation before passing to an
|
||||
operating system library, or it could be used to pass around structured data
|
||||
in its native, in-memory format.
|
||||
|
||||
Contrary to most data types exposed by the Python interpreter, buffers
|
||||
are not :c:type:`PyObject` pointers but rather simple C structures. This
|
||||
allows them to be created and copied very simply. When a generic wrapper
|
||||
around a buffer is needed, a :ref:`memoryview <memoryview-objects>` object
|
||||
can be created.
|
||||
|
||||
For short instructions how to write an exporting object, see
|
||||
:ref:`Buffer Object Structures <buffer-structs>`. For obtaining
|
||||
a buffer, see :c:func:`PyObject_GetBuffer`.
|
||||
|
||||
.. c:type:: Py_buffer
|
||||
|
||||
.. c:member:: void \*buf
|
||||
|
||||
A pointer to the start of the logical structure described by the buffer
|
||||
fields. This can be any location within the underlying physical memory
|
||||
block of the exporter. For example, with negative :c:member:`~Py_buffer.strides`
|
||||
the value may point to the end of the memory block.
|
||||
|
||||
For :term:`contiguous` arrays, the value points to the beginning of
|
||||
the memory block.
|
||||
|
||||
.. c:member:: void \*obj
|
||||
|
||||
A new reference to the exporting object. The reference is owned by
|
||||
the consumer and automatically decremented and set to *NULL* by
|
||||
:c:func:`PyBuffer_Release`. The field is the equivalent of the return
|
||||
value of any standard C-API function.
|
||||
|
||||
As a special case, for *temporary* buffers that are wrapped by
|
||||
:c:func:`PyMemoryView_FromBuffer` or :c:func:`PyBuffer_FillInfo`
|
||||
this field is *NULL*. In general, exporting objects MUST NOT
|
||||
use this scheme.
|
||||
|
||||
.. c:member:: Py_ssize_t len
|
||||
|
||||
``product(shape) * itemsize``. For contiguous arrays, this is the length
|
||||
of the underlying memory block. For non-contiguous arrays, it is the length
|
||||
that the logical structure would have if it were copied to a contiguous
|
||||
representation.
|
||||
|
||||
Accessing ``((char *)buf)[0] up to ((char *)buf)[len-1]`` is only valid
|
||||
if the buffer has been obtained by a request that guarantees contiguity. In
|
||||
most cases such a request will be :c:macro:`PyBUF_SIMPLE` or :c:macro:`PyBUF_WRITABLE`.
|
||||
|
||||
.. c:member:: int readonly
|
||||
|
||||
An indicator of whether the buffer is read-only. This field is controlled
|
||||
by the :c:macro:`PyBUF_WRITABLE` flag.
|
||||
|
||||
.. c:member:: Py_ssize_t itemsize
|
||||
|
||||
Item size in bytes of a single element. Same as the value of :func:`struct.calcsize`
|
||||
called on non-NULL :c:member:`~Py_buffer.format` values.
|
||||
|
||||
Important exception: If a consumer requests a buffer without the
|
||||
:c:macro:`PyBUF_FORMAT` flag, :c:member:`~Py_buffer.format` will
|
||||
be set to *NULL*, but :c:member:`~Py_buffer.itemsize` still has
|
||||
the value for the original format.
|
||||
|
||||
If :c:member:`~Py_buffer.shape` is present, the equality
|
||||
``product(shape) * itemsize == len`` still holds and the consumer
|
||||
can use :c:member:`~Py_buffer.itemsize` to navigate the buffer.
|
||||
|
||||
If :c:member:`~Py_buffer.shape` is *NULL* as a result of a :c:macro:`PyBUF_SIMPLE`
|
||||
or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard
|
||||
:c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``.
|
||||
|
||||
.. c:member:: const char \*format
|
||||
|
||||
A *NUL* terminated string in :mod:`struct` module style syntax describing
|
||||
the contents of a single item. If this is *NULL*, ``"B"`` (unsigned bytes)
|
||||
is assumed.
|
||||
|
||||
This field is controlled by the :c:macro:`PyBUF_FORMAT` flag.
|
||||
|
||||
.. c:member:: int ndim
|
||||
|
||||
The number of dimensions the memory represents as an n-dimensional array.
|
||||
If it is ``0``, :c:member:`~Py_buffer.buf` points to a single item representing
|
||||
a scalar. In this case, :c:member:`~Py_buffer.shape`, :c:member:`~Py_buffer.strides`
|
||||
and :c:member:`~Py_buffer.suboffsets` MUST be *NULL*.
|
||||
|
||||
The macro :c:macro:`PyBUF_MAX_NDIM` limits the maximum number of dimensions
|
||||
to 64. Exporters MUST respect this limit, consumers of multi-dimensional
|
||||
buffers SHOULD be able to handle up to :c:macro:`PyBUF_MAX_NDIM` dimensions.
|
||||
|
||||
.. c:member:: Py_ssize_t \*shape
|
||||
|
||||
An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
|
||||
indicating the shape of the memory as an n-dimensional array. Note that
|
||||
``shape[0] * ... * shape[ndim-1] * itemsize`` MUST be equal to
|
||||
:c:member:`~Py_buffer.len`.
|
||||
|
||||
Shape values are restricted to ``shape[n] >= 0``. The case
|
||||
``shape[n] == 0`` requires special attention. See `complex arrays`_
|
||||
for further information.
|
||||
|
||||
The shape array is read-only for the consumer.
|
||||
|
||||
.. c:member:: Py_ssize_t \*strides
|
||||
|
||||
An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`
|
||||
giving the number of bytes to skip to get to a new element in each
|
||||
dimension.
|
||||
|
||||
Stride values can be any integer. For regular arrays, strides are
|
||||
usually positive, but a consumer MUST be able to handle the case
|
||||
``strides[n] <= 0``. See `complex arrays`_ for further information.
|
||||
|
||||
The strides array is read-only for the consumer.
|
||||
|
||||
.. c:member:: Py_ssize_t \*suboffsets
|
||||
|
||||
An array of :c:type:`Py_ssize_t` of length :c:member:`~Py_buffer.ndim`.
|
||||
If ``suboffsets[n] >= 0``, the values stored along the nth dimension are
|
||||
pointers and the suboffset value dictates how many bytes to add to each
|
||||
pointer after de-referencing. A suboffset value that is negative
|
||||
indicates that no de-referencing should occur (striding in a contiguous
|
||||
memory block).
|
||||
|
||||
If all suboffsets are negative (i.e. no de-referencing is needed), then
|
||||
this field must be NULL (the default value).
|
||||
|
||||
This type of array representation is used by the Python Imaging Library
|
||||
(PIL). See `complex arrays`_ for further information how to access elements
|
||||
of such an array.
|
||||
|
||||
The suboffsets array is read-only for the consumer.
|
||||
|
||||
.. c:member:: void \*internal
|
||||
|
||||
This is for use internally by the exporting object. For example, this
|
||||
might be re-cast as an integer by the exporter and used to store flags
|
||||
about whether or not the shape, strides, and suboffsets arrays must be
|
||||
freed when the buffer is released. The consumer MUST NOT alter this
|
||||
value.
|
||||
|
||||
.. _buffer-request-types:
|
||||
|
||||
Buffer request types
|
||||
====================
|
||||
|
||||
Buffers are usually obtained by sending a buffer request to an exporting
|
||||
object via :c:func:`PyObject_GetBuffer`. Since the complexity of the logical
|
||||
structure of the memory can vary drastically, the consumer uses the *flags*
|
||||
argument to specify the exact buffer type it can handle.
|
||||
|
||||
All :c:data:`Py_buffer` fields are unambiguously defined by the request
|
||||
type.
|
||||
|
||||
request-independent fields
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The following fields are not influenced by *flags* and must always be filled in
|
||||
with the correct values: :c:member:`~Py_buffer.obj`, :c:member:`~Py_buffer.buf`,
|
||||
:c:member:`~Py_buffer.len`, :c:member:`~Py_buffer.itemsize`, :c:member:`~Py_buffer.ndim`.
|
||||
|
||||
|
||||
readonly, format
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
.. c:macro:: PyBUF_WRITABLE
|
||||
|
||||
Controls the :c:member:`~Py_buffer.readonly` field. If set, the exporter
|
||||
MUST provide a writable buffer or else report failure. Otherwise, the
|
||||
exporter MAY provide either a read-only or writable buffer, but the choice
|
||||
MUST be consistent for all consumers.
|
||||
|
||||
.. c:macro:: PyBUF_FORMAT
|
||||
|
||||
Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST
|
||||
be filled in correctly. Otherwise, this field MUST be *NULL*.
|
||||
|
||||
|
||||
:c:macro:`PyBUF_WRITABLE` can be \|'d to any of the flags in the next section.
|
||||
Since :c:macro:`PyBUF_SIMPLE` is defined as 0, :c:macro:`PyBUF_WRITABLE`
|
||||
can be used as a stand-alone flag to request a simple writable buffer.
|
||||
|
||||
:c:macro:`PyBUF_FORMAT` can be \|'d to any of the flags except :c:macro:`PyBUF_SIMPLE`.
|
||||
The latter already implies format ``B`` (unsigned bytes).
|
||||
|
||||
|
||||
shape, strides, suboffsets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The flags that control the logical structure of the memory are listed
|
||||
in decreasing order of complexity. Note that each flag contains all bits
|
||||
of the flags below it.
|
||||
|
||||
.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|
|
||||
|
||||
+-----------------------------+-------+---------+------------+
|
||||
| Request | shape | strides | suboffsets |
|
||||
+=============================+=======+=========+============+
|
||||
| .. c:macro:: PyBUF_INDIRECT | yes | yes | if needed |
|
||||
+-----------------------------+-------+---------+------------+
|
||||
| .. c:macro:: PyBUF_STRIDES | yes | yes | NULL |
|
||||
+-----------------------------+-------+---------+------------+
|
||||
| .. c:macro:: PyBUF_ND | yes | NULL | NULL |
|
||||
+-----------------------------+-------+---------+------------+
|
||||
| .. c:macro:: PyBUF_SIMPLE | NULL | NULL | NULL |
|
||||
+-----------------------------+-------+---------+------------+
|
||||
|
||||
|
||||
.. index:: contiguous, C-contiguous, Fortran contiguous
|
||||
|
||||
contiguity requests
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
C or Fortran :term:`contiguity <contiguous>` can be explicitly requested,
|
||||
with and without stride information. Without stride information, the buffer
|
||||
must be C-contiguous.
|
||||
|
||||
.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|l|
|
||||
|
||||
+-----------------------------------+-------+---------+------------+--------+
|
||||
| Request | shape | strides | suboffsets | contig |
|
||||
+===================================+=======+=========+============+========+
|
||||
| .. c:macro:: PyBUF_C_CONTIGUOUS | yes | yes | NULL | C |
|
||||
+-----------------------------------+-------+---------+------------+--------+
|
||||
| .. c:macro:: PyBUF_F_CONTIGUOUS | yes | yes | NULL | F |
|
||||
+-----------------------------------+-------+---------+------------+--------+
|
||||
| .. c:macro:: PyBUF_ANY_CONTIGUOUS | yes | yes | NULL | C or F |
|
||||
+-----------------------------------+-------+---------+------------+--------+
|
||||
| .. c:macro:: PyBUF_ND | yes | NULL | NULL | C |
|
||||
+-----------------------------------+-------+---------+------------+--------+
|
||||
|
||||
|
||||
compound requests
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
All possible requests are fully defined by some combination of the flags in
|
||||
the previous section. For convenience, the buffer protocol provides frequently
|
||||
used combinations as single flags.
|
||||
|
||||
In the following table *U* stands for undefined contiguity. The consumer would
|
||||
have to call :c:func:`PyBuffer_IsContiguous` to determine contiguity.
|
||||
|
||||
.. tabularcolumns:: |p{0.35\linewidth}|l|l|l|l|l|l|
|
||||
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| Request | shape | strides | suboffsets | contig | readonly | format |
|
||||
+===============================+=======+=========+============+========+==========+========+
|
||||
| .. c:macro:: PyBUF_FULL | yes | yes | if needed | U | 0 | yes |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_FULL_RO | yes | yes | if needed | U | 1 or 0 | yes |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_RECORDS | yes | yes | NULL | U | 0 | yes |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_RECORDS_RO | yes | yes | NULL | U | 1 or 0 | yes |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_STRIDED | yes | yes | NULL | U | 0 | NULL |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_STRIDED_RO | yes | yes | NULL | U | 1 or 0 | NULL |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_CONTIG | yes | NULL | NULL | C | 0 | NULL |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
| .. c:macro:: PyBUF_CONTIG_RO | yes | NULL | NULL | C | 1 or 0 | NULL |
|
||||
+-------------------------------+-------+---------+------------+--------+----------+--------+
|
||||
|
||||
|
||||
Complex arrays
|
||||
==============
|
||||
|
||||
NumPy-style: shape and strides
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The logical structure of NumPy-style arrays is defined by :c:member:`~Py_buffer.itemsize`,
|
||||
:c:member:`~Py_buffer.ndim`, :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides`.
|
||||
|
||||
If ``ndim == 0``, the memory location pointed to by :c:member:`~Py_buffer.buf` is
|
||||
interpreted as a scalar of size :c:member:`~Py_buffer.itemsize`. In that case,
|
||||
both :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are *NULL*.
|
||||
|
||||
If :c:member:`~Py_buffer.strides` is *NULL*, the array is interpreted as
|
||||
a standard n-dimensional C-array. Otherwise, the consumer must access an
|
||||
n-dimensional array as follows:
|
||||
|
||||
``ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1]``
|
||||
``item = *((typeof(item) *)ptr);``
|
||||
|
||||
|
||||
As noted above, :c:member:`~Py_buffer.buf` can point to any location within
|
||||
the actual memory block. An exporter can check the validity of a buffer with
|
||||
this function:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
|
||||
"""Verify that the parameters represent a valid array within
|
||||
the bounds of the allocated memory:
|
||||
char *mem: start of the physical memory block
|
||||
memlen: length of the physical memory block
|
||||
offset: (char *)buf - mem
|
||||
"""
|
||||
if offset % itemsize:
|
||||
return False
|
||||
if offset < 0 or offset+itemsize > memlen:
|
||||
return False
|
||||
if any(v % itemsize for v in strides):
|
||||
return False
|
||||
|
||||
if ndim <= 0:
|
||||
return ndim == 0 and not shape and not strides
|
||||
if 0 in shape:
|
||||
return True
|
||||
|
||||
imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
|
||||
if strides[j] <= 0)
|
||||
imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
|
||||
if strides[j] > 0)
|
||||
|
||||
return 0 <= offset+imin and offset+imax+itemsize <= memlen
|
||||
|
||||
|
||||
PIL-style: shape, strides and suboffsets
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In addition to the regular items, PIL-style arrays can contain pointers
|
||||
that must be followed in order to get to the next element in a dimension.
|
||||
For example, the regular three-dimensional C-array ``char v[2][2][3]`` can
|
||||
also be viewed as an array of 2 pointers to 2 two-dimensional arrays:
|
||||
``char (*v[2])[2][3]``. In suboffsets representation, those two pointers
|
||||
can be embedded at the start of :c:member:`~Py_buffer.buf`, pointing
|
||||
to two ``char x[2][3]`` arrays that can be located anywhere in memory.
|
||||
|
||||
|
||||
Here is a function that returns a pointer to the element in an N-D array
|
||||
pointed to by an N-dimensional index when there are both non-NULL strides
|
||||
and suboffsets::
|
||||
|
||||
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
|
||||
Py_ssize_t *suboffsets, Py_ssize_t *indices) {
|
||||
char *pointer = (char*)buf;
|
||||
int i;
|
||||
for (i = 0; i < ndim; i++) {
|
||||
pointer += strides[i] * indices[i];
|
||||
if (suboffsets[i] >=0 ) {
|
||||
pointer = *((char**)pointer) + suboffsets[i];
|
||||
}
|
||||
}
|
||||
return (void*)pointer;
|
||||
}
|
||||
|
||||
|
||||
Buffer-related functions
|
||||
========================
|
||||
|
||||
.. c:function:: int PyObject_CheckBuffer(PyObject *obj)
|
||||
|
||||
Return ``1`` if *obj* supports the buffer interface otherwise ``0``. When ``1`` is
|
||||
returned, it doesn't guarantee that :c:func:`PyObject_GetBuffer` will
|
||||
succeed. This function always succeeds.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags)
|
||||
|
||||
Send a request to *exporter* to fill in *view* as specified by *flags*.
|
||||
If the exporter cannot provide a buffer of the exact type, it MUST raise
|
||||
:c:data:`PyExc_BufferError`, set :c:member:`view->obj` to *NULL* and
|
||||
return ``-1``.
|
||||
|
||||
On success, fill in *view*, set :c:member:`view->obj` to a new reference
|
||||
to *exporter* and return 0. In the case of chained buffer providers
|
||||
that redirect requests to a single object, :c:member:`view->obj` MAY
|
||||
refer to this object instead of *exporter* (See :ref:`Buffer Object Structures <buffer-structs>`).
|
||||
|
||||
Successful calls to :c:func:`PyObject_GetBuffer` must be paired with calls
|
||||
to :c:func:`PyBuffer_Release`, similar to :c:func:`malloc` and :c:func:`free`.
|
||||
Thus, after the consumer is done with the buffer, :c:func:`PyBuffer_Release`
|
||||
must be called exactly once.
|
||||
|
||||
|
||||
.. c:function:: void PyBuffer_Release(Py_buffer *view)
|
||||
|
||||
Release the buffer *view* and decrement the reference count for
|
||||
:c:member:`view->obj`. This function MUST be called when the buffer
|
||||
is no longer being used, otherwise reference leaks may occur.
|
||||
|
||||
It is an error to call this function on a buffer that was not obtained via
|
||||
:c:func:`PyObject_GetBuffer`.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyBuffer_SizeFromFormat(const char *)
|
||||
|
||||
Return the implied :c:data:`~Py_buffer.itemsize` from :c:data:`~Py_buffer.format`.
|
||||
This function is not yet implemented.
|
||||
|
||||
|
||||
.. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order)
|
||||
|
||||
Return ``1`` if the memory defined by the *view* is C-style (*order* is
|
||||
``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either one
|
||||
(*order* is ``'A'``). Return ``0`` otherwise. This function always succeeds.
|
||||
|
||||
|
||||
.. c:function:: int PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order)
|
||||
|
||||
Copy *len* bytes from *src* to its contiguous representation in *buf*.
|
||||
*order* can be ``'C'`` or ``'F'`` (for C-style or Fortran-style ordering).
|
||||
``0`` is returned on success, ``-1`` on error.
|
||||
|
||||
This function fails if *len* != *src->len*.
|
||||
|
||||
|
||||
.. c:function:: void PyBuffer_FillContiguousStrides(int ndims, Py_ssize_t *shape, Py_ssize_t *strides, int itemsize, char order)
|
||||
|
||||
Fill the *strides* array with byte-strides of a :term:`contiguous` (C-style if
|
||||
*order* is ``'C'`` or Fortran-style if *order* is ``'F'``) array of the
|
||||
given shape with the given number of bytes per element.
|
||||
|
||||
|
||||
.. c:function:: int PyBuffer_FillInfo(Py_buffer *view, PyObject *exporter, void *buf, Py_ssize_t len, int readonly, int flags)
|
||||
|
||||
Handle buffer requests for an exporter that wants to expose *buf* of size *len*
|
||||
with writability set according to *readonly*. *buf* is interpreted as a sequence
|
||||
of unsigned bytes.
|
||||
|
||||
The *flags* argument indicates the request type. This function always fills in
|
||||
*view* as specified by flags, unless *buf* has been designated as read-only
|
||||
and :c:macro:`PyBUF_WRITABLE` is set in *flags*.
|
||||
|
||||
On success, set :c:member:`view->obj` to a new reference to *exporter* and
|
||||
return 0. Otherwise, raise :c:data:`PyExc_BufferError`, set
|
||||
:c:member:`view->obj` to *NULL* and return ``-1``;
|
||||
|
||||
If this function is used as part of a :ref:`getbufferproc <buffer-structs>`,
|
||||
*exporter* MUST be set to the exporting object and *flags* must be passed
|
||||
unmodified. Otherwise, *exporter* MUST be NULL.
|
||||
87
python-3.7.4-docs-html/_sources/c-api/bytearray.rst.txt
Normal file
87
python-3.7.4-docs-html/_sources/c-api/bytearray.rst.txt
Normal file
@@ -0,0 +1,87 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _bytearrayobjects:
|
||||
|
||||
Byte Array Objects
|
||||
------------------
|
||||
|
||||
.. index:: object: bytearray
|
||||
|
||||
|
||||
.. c:type:: PyByteArrayObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python bytearray object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyByteArray_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python bytearray type;
|
||||
it is the same object as :class:`bytearray` in the Python layer.
|
||||
|
||||
|
||||
Type check macros
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. c:function:: int PyByteArray_Check(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a bytearray object or an instance of a
|
||||
subtype of the bytearray type.
|
||||
|
||||
|
||||
.. c:function:: int PyByteArray_CheckExact(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a bytearray object, but not an instance of a
|
||||
subtype of the bytearray type.
|
||||
|
||||
|
||||
Direct API functions
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. c:function:: PyObject* PyByteArray_FromObject(PyObject *o)
|
||||
|
||||
Return a new bytearray object from any object, *o*, that implements the
|
||||
:ref:`buffer protocol <bufferobjects>`.
|
||||
|
||||
.. XXX expand about the buffer protocol, at least somewhere
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len)
|
||||
|
||||
Create a new bytearray object from *string* and its length, *len*. On
|
||||
failure, *NULL* is returned.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyByteArray_Concat(PyObject *a, PyObject *b)
|
||||
|
||||
Concat bytearrays *a* and *b* and return a new bytearray with the result.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyByteArray_Size(PyObject *bytearray)
|
||||
|
||||
Return the size of *bytearray* after checking for a *NULL* pointer.
|
||||
|
||||
|
||||
.. c:function:: char* PyByteArray_AsString(PyObject *bytearray)
|
||||
|
||||
Return the contents of *bytearray* as a char array after checking for a
|
||||
*NULL* pointer. The returned array always has an extra
|
||||
null byte appended.
|
||||
|
||||
|
||||
.. c:function:: int PyByteArray_Resize(PyObject *bytearray, Py_ssize_t len)
|
||||
|
||||
Resize the internal buffer of *bytearray* to *len*.
|
||||
|
||||
Macros
|
||||
^^^^^^
|
||||
|
||||
These macros trade safety for speed and they don't check pointers.
|
||||
|
||||
.. c:function:: char* PyByteArray_AS_STRING(PyObject *bytearray)
|
||||
|
||||
Macro version of :c:func:`PyByteArray_AsString`.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyByteArray_GET_SIZE(PyObject *bytearray)
|
||||
|
||||
Macro version of :c:func:`PyByteArray_Size`.
|
||||
205
python-3.7.4-docs-html/_sources/c-api/bytes.rst.txt
Normal file
205
python-3.7.4-docs-html/_sources/c-api/bytes.rst.txt
Normal file
@@ -0,0 +1,205 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _bytesobjects:
|
||||
|
||||
Bytes Objects
|
||||
-------------
|
||||
|
||||
These functions raise :exc:`TypeError` when expecting a bytes parameter and are
|
||||
called with a non-bytes parameter.
|
||||
|
||||
.. index:: object: bytes
|
||||
|
||||
|
||||
.. c:type:: PyBytesObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python bytes object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyBytes_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python bytes type; it
|
||||
is the same object as :class:`bytes` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyBytes_Check(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a bytes object or an instance of a subtype
|
||||
of the bytes type.
|
||||
|
||||
|
||||
.. c:function:: int PyBytes_CheckExact(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a bytes object, but not an instance of a
|
||||
subtype of the bytes type.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBytes_FromString(const char *v)
|
||||
|
||||
Return a new bytes object with a copy of the string *v* as value on success,
|
||||
and *NULL* on failure. The parameter *v* must not be *NULL*; it will not be
|
||||
checked.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBytes_FromStringAndSize(const char *v, Py_ssize_t len)
|
||||
|
||||
Return a new bytes object with a copy of the string *v* as value and length
|
||||
*len* on success, and *NULL* on failure. If *v* is *NULL*, the contents of
|
||||
the bytes object are uninitialized.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBytes_FromFormat(const char *format, ...)
|
||||
|
||||
Take a C :c:func:`printf`\ -style *format* string and a variable number of
|
||||
arguments, calculate the size of the resulting Python bytes object and return
|
||||
a bytes object with the values formatted into it. The variable arguments
|
||||
must be C types and must correspond exactly to the format characters in the
|
||||
*format* string. The following format characters are allowed:
|
||||
|
||||
.. % XXX: This should be exactly the same as the table in PyErr_Format.
|
||||
.. % One should just refer to the other.
|
||||
.. % XXX: The descriptions for %zd and %zu are wrong, but the truth is complicated
|
||||
.. % because not all compilers support the %z width modifier -- we fake it
|
||||
.. % when necessary via interpolating PY_FORMAT_SIZE_T.
|
||||
|
||||
.. tabularcolumns:: |l|l|L|
|
||||
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| Format Characters | Type | Comment |
|
||||
+===================+===============+================================+
|
||||
| :attr:`%%` | *n/a* | The literal % character. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%c` | int | A single byte, |
|
||||
| | | represented as a C int. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%d` | int | Equivalent to |
|
||||
| | | ``printf("%d")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%u` | unsigned int | Equivalent to |
|
||||
| | | ``printf("%u")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%ld` | long | Equivalent to |
|
||||
| | | ``printf("%ld")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%lu` | unsigned long | Equivalent to |
|
||||
| | | ``printf("%lu")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%zd` | Py_ssize_t | Equivalent to |
|
||||
| | | ``printf("%zd")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%zu` | size_t | Equivalent to |
|
||||
| | | ``printf("%zu")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%i` | int | Equivalent to |
|
||||
| | | ``printf("%i")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%x` | int | Equivalent to |
|
||||
| | | ``printf("%x")``. [1]_ |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%s` | const char\* | A null-terminated C character |
|
||||
| | | array. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
| :attr:`%p` | const void\* | The hex representation of a C |
|
||||
| | | pointer. Mostly equivalent to |
|
||||
| | | ``printf("%p")`` except that |
|
||||
| | | it is guaranteed to start with |
|
||||
| | | the literal ``0x`` regardless |
|
||||
| | | of what the platform's |
|
||||
| | | ``printf`` yields. |
|
||||
+-------------------+---------------+--------------------------------+
|
||||
|
||||
An unrecognized format character causes all the rest of the format string to be
|
||||
copied as-is to the result object, and any extra arguments discarded.
|
||||
|
||||
.. [1] For integer specifiers (d, u, ld, lu, zd, zu, i, x): the 0-conversion
|
||||
flag has effect even when a precision is given.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBytes_FromFormatV(const char *format, va_list vargs)
|
||||
|
||||
Identical to :c:func:`PyBytes_FromFormat` except that it takes exactly two
|
||||
arguments.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyBytes_FromObject(PyObject *o)
|
||||
|
||||
Return the bytes representation of object *o* that implements the buffer
|
||||
protocol.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyBytes_Size(PyObject *o)
|
||||
|
||||
Return the length of the bytes in bytes object *o*.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyBytes_GET_SIZE(PyObject *o)
|
||||
|
||||
Macro form of :c:func:`PyBytes_Size` but without error checking.
|
||||
|
||||
|
||||
.. c:function:: char* PyBytes_AsString(PyObject *o)
|
||||
|
||||
Return a pointer to the contents of *o*. The pointer
|
||||
refers to the internal buffer of *o*, which consists of ``len(o) + 1``
|
||||
bytes. The last byte in the buffer is always null, regardless of
|
||||
whether there are any other null bytes. The data must not be
|
||||
modified in any way, unless the object was just created using
|
||||
``PyBytes_FromStringAndSize(NULL, size)``. It must not be deallocated. If
|
||||
*o* is not a bytes object at all, :c:func:`PyBytes_AsString` returns *NULL*
|
||||
and raises :exc:`TypeError`.
|
||||
|
||||
|
||||
.. c:function:: char* PyBytes_AS_STRING(PyObject *string)
|
||||
|
||||
Macro form of :c:func:`PyBytes_AsString` but without error checking.
|
||||
|
||||
|
||||
.. c:function:: int PyBytes_AsStringAndSize(PyObject *obj, char **buffer, Py_ssize_t *length)
|
||||
|
||||
Return the null-terminated contents of the object *obj*
|
||||
through the output variables *buffer* and *length*.
|
||||
|
||||
If *length* is *NULL*, the bytes object
|
||||
may not contain embedded null bytes;
|
||||
if it does, the function returns ``-1`` and a :exc:`ValueError` is raised.
|
||||
|
||||
The buffer refers to an internal buffer of *obj*, which includes an
|
||||
additional null byte at the end (not counted in *length*). The data
|
||||
must not be modified in any way, unless the object was just created using
|
||||
``PyBytes_FromStringAndSize(NULL, size)``. It must not be deallocated. If
|
||||
*obj* is not a bytes object at all, :c:func:`PyBytes_AsStringAndSize`
|
||||
returns ``-1`` and raises :exc:`TypeError`.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Previously, :exc:`TypeError` was raised when embedded null bytes were
|
||||
encountered in the bytes object.
|
||||
|
||||
|
||||
.. c:function:: void PyBytes_Concat(PyObject **bytes, PyObject *newpart)
|
||||
|
||||
Create a new bytes object in *\*bytes* containing the contents of *newpart*
|
||||
appended to *bytes*; the caller will own the new reference. The reference to
|
||||
the old value of *bytes* will be stolen. If the new object cannot be
|
||||
created, the old reference to *bytes* will still be discarded and the value
|
||||
of *\*bytes* will be set to *NULL*; the appropriate exception will be set.
|
||||
|
||||
|
||||
.. c:function:: void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart)
|
||||
|
||||
Create a new bytes object in *\*bytes* containing the contents of *newpart*
|
||||
appended to *bytes*. This version decrements the reference count of
|
||||
*newpart*.
|
||||
|
||||
|
||||
.. c:function:: int _PyBytes_Resize(PyObject **bytes, Py_ssize_t newsize)
|
||||
|
||||
A way to resize a bytes object even though it is "immutable". Only use this
|
||||
to build up a brand new bytes object; don't use this if the bytes may already
|
||||
be known in other parts of the code. It is an error to call this function if
|
||||
the refcount on the input bytes object is not one. Pass the address of an
|
||||
existing bytes object as an lvalue (it may be written into), and the new size
|
||||
desired. On success, *\*bytes* holds the resized bytes object and ``0`` is
|
||||
returned; the address in *\*bytes* may differ from its input value. If the
|
||||
reallocation fails, the original bytes object at *\*bytes* is deallocated,
|
||||
*\*bytes* is set to *NULL*, :exc:`MemoryError` is set, and ``-1`` is
|
||||
returned.
|
||||
157
python-3.7.4-docs-html/_sources/c-api/capsule.rst.txt
Normal file
157
python-3.7.4-docs-html/_sources/c-api/capsule.rst.txt
Normal file
@@ -0,0 +1,157 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _capsules:
|
||||
|
||||
Capsules
|
||||
--------
|
||||
|
||||
.. index:: object: Capsule
|
||||
|
||||
Refer to :ref:`using-capsules` for more information on using these objects.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
|
||||
|
||||
.. c:type:: PyCapsule
|
||||
|
||||
This subtype of :c:type:`PyObject` represents an opaque value, useful for C
|
||||
extension modules who need to pass an opaque value (as a :c:type:`void\*`
|
||||
pointer) through Python code to other C code. It is often used to make a C
|
||||
function pointer defined in one module available to other modules, so the
|
||||
regular import mechanism can be used to access C APIs defined in dynamically
|
||||
loaded modules.
|
||||
|
||||
|
||||
.. c:type:: PyCapsule_Destructor
|
||||
|
||||
The type of a destructor callback for a capsule. Defined as::
|
||||
|
||||
typedef void (*PyCapsule_Destructor)(PyObject *);
|
||||
|
||||
See :c:func:`PyCapsule_New` for the semantics of PyCapsule_Destructor
|
||||
callbacks.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_CheckExact(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyCapsule`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
|
||||
|
||||
Create a :c:type:`PyCapsule` encapsulating the *pointer*. The *pointer*
|
||||
argument may not be *NULL*.
|
||||
|
||||
On failure, set an exception and return *NULL*.
|
||||
|
||||
The *name* string may either be *NULL* or a pointer to a valid C string. If
|
||||
non-*NULL*, this string must outlive the capsule. (Though it is permitted to
|
||||
free it inside the *destructor*.)
|
||||
|
||||
If the *destructor* argument is not *NULL*, it will be called with the
|
||||
capsule as its argument when it is destroyed.
|
||||
|
||||
If this capsule will be stored as an attribute of a module, the *name* should
|
||||
be specified as ``modulename.attributename``. This will enable other modules
|
||||
to import the capsule using :c:func:`PyCapsule_Import`.
|
||||
|
||||
|
||||
.. c:function:: void* PyCapsule_GetPointer(PyObject *capsule, const char *name)
|
||||
|
||||
Retrieve the *pointer* stored in the capsule. On failure, set an exception
|
||||
and return *NULL*.
|
||||
|
||||
The *name* parameter must compare exactly to the name stored in the capsule.
|
||||
If the name stored in the capsule is *NULL*, the *name* passed in must also
|
||||
be *NULL*. Python uses the C function :c:func:`strcmp` to compare capsule
|
||||
names.
|
||||
|
||||
|
||||
.. c:function:: PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)
|
||||
|
||||
Return the current destructor stored in the capsule. On failure, set an
|
||||
exception and return *NULL*.
|
||||
|
||||
It is legal for a capsule to have a *NULL* destructor. This makes a *NULL*
|
||||
return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
|
||||
:c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: void* PyCapsule_GetContext(PyObject *capsule)
|
||||
|
||||
Return the current context stored in the capsule. On failure, set an
|
||||
exception and return *NULL*.
|
||||
|
||||
It is legal for a capsule to have a *NULL* context. This makes a *NULL*
|
||||
return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
|
||||
:c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: const char* PyCapsule_GetName(PyObject *capsule)
|
||||
|
||||
Return the current name stored in the capsule. On failure, set an exception
|
||||
and return *NULL*.
|
||||
|
||||
It is legal for a capsule to have a *NULL* name. This makes a *NULL* return
|
||||
code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
|
||||
:c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: void* PyCapsule_Import(const char *name, int no_block)
|
||||
|
||||
Import a pointer to a C object from a capsule attribute in a module. The
|
||||
*name* parameter should specify the full name to the attribute, as in
|
||||
``module.attribute``. The *name* stored in the capsule must match this
|
||||
string exactly. If *no_block* is true, import the module without blocking
|
||||
(using :c:func:`PyImport_ImportModuleNoBlock`). If *no_block* is false,
|
||||
import the module conventionally (using :c:func:`PyImport_ImportModule`).
|
||||
|
||||
Return the capsule's internal *pointer* on success. On failure, set an
|
||||
exception and return *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_IsValid(PyObject *capsule, const char *name)
|
||||
|
||||
Determines whether or not *capsule* is a valid capsule. A valid capsule is
|
||||
non-*NULL*, passes :c:func:`PyCapsule_CheckExact`, has a non-*NULL* pointer
|
||||
stored in it, and its internal name matches the *name* parameter. (See
|
||||
:c:func:`PyCapsule_GetPointer` for information on how capsule names are
|
||||
compared.)
|
||||
|
||||
In other words, if :c:func:`PyCapsule_IsValid` returns a true value, calls to
|
||||
any of the accessors (any function starting with :c:func:`PyCapsule_Get`) are
|
||||
guaranteed to succeed.
|
||||
|
||||
Return a nonzero value if the object is valid and matches the name passed in.
|
||||
Return ``0`` otherwise. This function will not fail.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_SetContext(PyObject *capsule, void *context)
|
||||
|
||||
Set the context pointer inside *capsule* to *context*.
|
||||
|
||||
Return ``0`` on success. Return nonzero and set an exception on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_SetDestructor(PyObject *capsule, PyCapsule_Destructor destructor)
|
||||
|
||||
Set the destructor inside *capsule* to *destructor*.
|
||||
|
||||
Return ``0`` on success. Return nonzero and set an exception on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_SetName(PyObject *capsule, const char *name)
|
||||
|
||||
Set the name inside *capsule* to *name*. If non-*NULL*, the name must
|
||||
outlive the capsule. If the previous *name* stored in the capsule was not
|
||||
*NULL*, no attempt is made to free it.
|
||||
|
||||
Return ``0`` on success. Return nonzero and set an exception on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyCapsule_SetPointer(PyObject *capsule, void *pointer)
|
||||
|
||||
Set the void pointer inside *capsule* to *pointer*. The pointer may not be
|
||||
*NULL*.
|
||||
|
||||
Return ``0`` on success. Return nonzero and set an exception on failure.
|
||||
62
python-3.7.4-docs-html/_sources/c-api/cell.rst.txt
Normal file
62
python-3.7.4-docs-html/_sources/c-api/cell.rst.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _cell-objects:
|
||||
|
||||
Cell Objects
|
||||
------------
|
||||
|
||||
"Cell" objects are used to implement variables referenced by multiple scopes.
|
||||
For each such variable, a cell object is created to store the value; the local
|
||||
variables of each stack frame that references the value contains a reference to
|
||||
the cells from outer scopes which also use that variable. When the value is
|
||||
accessed, the value contained in the cell is used instead of the cell object
|
||||
itself. This de-referencing of the cell object requires support from the
|
||||
generated byte-code; these are not automatically de-referenced when accessed.
|
||||
Cell objects are not likely to be useful elsewhere.
|
||||
|
||||
|
||||
.. c:type:: PyCellObject
|
||||
|
||||
The C structure used for cell objects.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyCell_Type
|
||||
|
||||
The type object corresponding to cell objects.
|
||||
|
||||
|
||||
.. c:function:: int PyCell_Check(ob)
|
||||
|
||||
Return true if *ob* is a cell object; *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCell_New(PyObject *ob)
|
||||
|
||||
Create and return a new cell object containing the value *ob*. The parameter may
|
||||
be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCell_Get(PyObject *cell)
|
||||
|
||||
Return the contents of the cell *cell*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCell_GET(PyObject *cell)
|
||||
|
||||
Return the contents of the cell *cell*, but without checking that *cell* is
|
||||
non-*NULL* and a cell object.
|
||||
|
||||
|
||||
.. c:function:: int PyCell_Set(PyObject *cell, PyObject *value)
|
||||
|
||||
Set the contents of the cell object *cell* to *value*. This releases the
|
||||
reference to any current content of the cell. *value* may be *NULL*. *cell*
|
||||
must be non-*NULL*; if it is not a cell object, ``-1`` will be returned. On
|
||||
success, ``0`` will be returned.
|
||||
|
||||
|
||||
.. c:function:: void PyCell_SET(PyObject *cell, PyObject *value)
|
||||
|
||||
Sets the value of the cell object *cell* to *value*. No reference counts are
|
||||
adjusted, and no checks are made for safety; *cell* must be non-*NULL* and must
|
||||
be a cell object.
|
||||
48
python-3.7.4-docs-html/_sources/c-api/code.rst.txt
Normal file
48
python-3.7.4-docs-html/_sources/c-api/code.rst.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _codeobjects:
|
||||
|
||||
.. index:: object; code, code object
|
||||
|
||||
Code Objects
|
||||
------------
|
||||
|
||||
.. sectionauthor:: Jeffrey Yasskin <jyasskin@gmail.com>
|
||||
|
||||
Code objects are a low-level detail of the CPython implementation.
|
||||
Each one represents a chunk of executable code that hasn't yet been
|
||||
bound into a function.
|
||||
|
||||
.. c:type:: PyCodeObject
|
||||
|
||||
The C structure of the objects used to describe code objects. The
|
||||
fields of this type are subject to change at any time.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyCode_Type
|
||||
|
||||
This is an instance of :c:type:`PyTypeObject` representing the Python
|
||||
:class:`code` type.
|
||||
|
||||
|
||||
.. c:function:: int PyCode_Check(PyObject *co)
|
||||
|
||||
Return true if *co* is a :class:`code` object.
|
||||
|
||||
.. c:function:: int PyCode_GetNumFree(PyCodeObject *co)
|
||||
|
||||
Return the number of free variables in *co*.
|
||||
|
||||
.. c:function:: PyCodeObject* PyCode_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab)
|
||||
|
||||
Return a new code object. If you need a dummy code object to
|
||||
create a frame, use :c:func:`PyCode_NewEmpty` instead. Calling
|
||||
:c:func:`PyCode_New` directly can bind you to a precise Python
|
||||
version since the definition of the bytecode changes often.
|
||||
|
||||
|
||||
.. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
|
||||
|
||||
Return a new empty code object with the specified filename,
|
||||
function name, and first line number. It is illegal to
|
||||
:func:`exec` or :func:`eval` the resulting code object.
|
||||
123
python-3.7.4-docs-html/_sources/c-api/codec.rst.txt
Normal file
123
python-3.7.4-docs-html/_sources/c-api/codec.rst.txt
Normal file
@@ -0,0 +1,123 @@
|
||||
.. _codec-registry:
|
||||
|
||||
Codec registry and support functions
|
||||
====================================
|
||||
|
||||
.. c:function:: int PyCodec_Register(PyObject *search_function)
|
||||
|
||||
Register a new codec search function.
|
||||
|
||||
As side effect, this tries to load the :mod:`encodings` package, if not yet
|
||||
done, to make sure that it is always first in the list of search functions.
|
||||
|
||||
.. c:function:: int PyCodec_KnownEncoding(const char *encoding)
|
||||
|
||||
Return ``1`` or ``0`` depending on whether there is a registered codec for
|
||||
the given *encoding*. This function always succeeds.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_Encode(PyObject *object, const char *encoding, const char *errors)
|
||||
|
||||
Generic codec based encoding API.
|
||||
|
||||
*object* is passed through the encoder function found for the given
|
||||
*encoding* using the error handling method defined by *errors*. *errors* may
|
||||
be *NULL* to use the default method defined for the codec. Raises a
|
||||
:exc:`LookupError` if no encoder can be found.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_Decode(PyObject *object, const char *encoding, const char *errors)
|
||||
|
||||
Generic codec based decoding API.
|
||||
|
||||
*object* is passed through the decoder function found for the given
|
||||
*encoding* using the error handling method defined by *errors*. *errors* may
|
||||
be *NULL* to use the default method defined for the codec. Raises a
|
||||
:exc:`LookupError` if no encoder can be found.
|
||||
|
||||
|
||||
Codec lookup API
|
||||
----------------
|
||||
|
||||
In the following functions, the *encoding* string is looked up converted to all
|
||||
lower-case characters, which makes encodings looked up through this mechanism
|
||||
effectively case-insensitive. If no codec is found, a :exc:`KeyError` is set
|
||||
and *NULL* returned.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_Encoder(const char *encoding)
|
||||
|
||||
Get an encoder function for the given *encoding*.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_Decoder(const char *encoding)
|
||||
|
||||
Get a decoder function for the given *encoding*.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_IncrementalEncoder(const char *encoding, const char *errors)
|
||||
|
||||
Get an :class:`~codecs.IncrementalEncoder` object for the given *encoding*.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_IncrementalDecoder(const char *encoding, const char *errors)
|
||||
|
||||
Get an :class:`~codecs.IncrementalDecoder` object for the given *encoding*.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_StreamReader(const char *encoding, PyObject *stream, const char *errors)
|
||||
|
||||
Get a :class:`~codecs.StreamReader` factory function for the given *encoding*.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_StreamWriter(const char *encoding, PyObject *stream, const char *errors)
|
||||
|
||||
Get a :class:`~codecs.StreamWriter` factory function for the given *encoding*.
|
||||
|
||||
|
||||
Registry API for Unicode encoding error handlers
|
||||
------------------------------------------------
|
||||
|
||||
.. c:function:: int PyCodec_RegisterError(const char *name, PyObject *error)
|
||||
|
||||
Register the error handling callback function *error* under the given *name*.
|
||||
This callback function will be called by a codec when it encounters
|
||||
unencodable characters/undecodable bytes and *name* is specified as the error
|
||||
parameter in the call to the encode/decode function.
|
||||
|
||||
The callback gets a single argument, an instance of
|
||||
:exc:`UnicodeEncodeError`, :exc:`UnicodeDecodeError` or
|
||||
:exc:`UnicodeTranslateError` that holds information about the problematic
|
||||
sequence of characters or bytes and their offset in the original string (see
|
||||
:ref:`unicodeexceptions` for functions to extract this information). The
|
||||
callback must either raise the given exception, or return a two-item tuple
|
||||
containing the replacement for the problematic sequence, and an integer
|
||||
giving the offset in the original string at which encoding/decoding should be
|
||||
resumed.
|
||||
|
||||
Return ``0`` on success, ``-1`` on error.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_LookupError(const char *name)
|
||||
|
||||
Lookup the error handling callback function registered under *name*. As a
|
||||
special case *NULL* can be passed, in which case the error handling callback
|
||||
for "strict" will be returned.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_StrictErrors(PyObject *exc)
|
||||
|
||||
Raise *exc* as an exception.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_IgnoreErrors(PyObject *exc)
|
||||
|
||||
Ignore the unicode error, skipping the faulty input.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_ReplaceErrors(PyObject *exc)
|
||||
|
||||
Replace the unicode encode error with ``?`` or ``U+FFFD``.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
|
||||
|
||||
Replace the unicode encode error with XML character references.
|
||||
|
||||
.. c:function:: PyObject* PyCodec_BackslashReplaceErrors(PyObject *exc)
|
||||
|
||||
Replace the unicode encode error with backslash escapes (``\x``, ``\u`` and
|
||||
``\U``).
|
||||
|
||||
.. c:function:: PyObject* PyCodec_NameReplaceErrors(PyObject *exc)
|
||||
|
||||
Replace the unicode encode error with ``\N{...}`` escapes.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
132
python-3.7.4-docs-html/_sources/c-api/complex.rst.txt
Normal file
132
python-3.7.4-docs-html/_sources/c-api/complex.rst.txt
Normal file
@@ -0,0 +1,132 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _complexobjects:
|
||||
|
||||
Complex Number Objects
|
||||
----------------------
|
||||
|
||||
.. index:: object: complex number
|
||||
|
||||
Python's complex number objects are implemented as two distinct types when
|
||||
viewed from the C API: one is the Python object exposed to Python programs, and
|
||||
the other is a C structure which represents the actual complex number value.
|
||||
The API provides functions for working with both.
|
||||
|
||||
|
||||
Complex Numbers as C Structures
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Note that the functions which accept these structures as parameters and return
|
||||
them as results do so *by value* rather than dereferencing them through
|
||||
pointers. This is consistent throughout the API.
|
||||
|
||||
|
||||
.. c:type:: Py_complex
|
||||
|
||||
The C structure which corresponds to the value portion of a Python complex
|
||||
number object. Most of the functions for dealing with complex number objects
|
||||
use structures of this type as input or output values, as appropriate. It is
|
||||
defined as::
|
||||
|
||||
typedef struct {
|
||||
double real;
|
||||
double imag;
|
||||
} Py_complex;
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_sum(Py_complex left, Py_complex right)
|
||||
|
||||
Return the sum of two complex numbers, using the C :c:type:`Py_complex`
|
||||
representation.
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_diff(Py_complex left, Py_complex right)
|
||||
|
||||
Return the difference between two complex numbers, using the C
|
||||
:c:type:`Py_complex` representation.
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_neg(Py_complex complex)
|
||||
|
||||
Return the negation of the complex number *complex*, using the C
|
||||
:c:type:`Py_complex` representation.
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_prod(Py_complex left, Py_complex right)
|
||||
|
||||
Return the product of two complex numbers, using the C :c:type:`Py_complex`
|
||||
representation.
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)
|
||||
|
||||
Return the quotient of two complex numbers, using the C :c:type:`Py_complex`
|
||||
representation.
|
||||
|
||||
If *divisor* is null, this method returns zero and sets
|
||||
:c:data:`errno` to :c:data:`EDOM`.
|
||||
|
||||
|
||||
.. c:function:: Py_complex _Py_c_pow(Py_complex num, Py_complex exp)
|
||||
|
||||
Return the exponentiation of *num* by *exp*, using the C :c:type:`Py_complex`
|
||||
representation.
|
||||
|
||||
If *num* is null and *exp* is not a positive real number,
|
||||
this method returns zero and sets :c:data:`errno` to :c:data:`EDOM`.
|
||||
|
||||
|
||||
Complex Numbers as Python Objects
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
.. c:type:: PyComplexObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python complex number object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyComplex_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python complex number
|
||||
type. It is the same object as :class:`complex` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyComplex_Check(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyComplexObject` or a subtype of
|
||||
:c:type:`PyComplexObject`.
|
||||
|
||||
|
||||
.. c:function:: int PyComplex_CheckExact(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyComplexObject`, but not a subtype of
|
||||
:c:type:`PyComplexObject`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyComplex_FromCComplex(Py_complex v)
|
||||
|
||||
Create a new Python complex number object from a C :c:type:`Py_complex` value.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyComplex_FromDoubles(double real, double imag)
|
||||
|
||||
Return a new :c:type:`PyComplexObject` object from *real* and *imag*.
|
||||
|
||||
|
||||
.. c:function:: double PyComplex_RealAsDouble(PyObject *op)
|
||||
|
||||
Return the real part of *op* as a C :c:type:`double`.
|
||||
|
||||
|
||||
.. c:function:: double PyComplex_ImagAsDouble(PyObject *op)
|
||||
|
||||
Return the imaginary part of *op* as a C :c:type:`double`.
|
||||
|
||||
|
||||
.. c:function:: Py_complex PyComplex_AsCComplex(PyObject *op)
|
||||
|
||||
Return the :c:type:`Py_complex` value of the complex number *op*.
|
||||
|
||||
If *op* is not a Python complex number object but has a :meth:`__complex__`
|
||||
method, this method will first be called to convert *op* to a Python complex
|
||||
number object. Upon failure, this method returns ``-1.0`` as a real value.
|
||||
117
python-3.7.4-docs-html/_sources/c-api/concrete.rst.txt
Normal file
117
python-3.7.4-docs-html/_sources/c-api/concrete.rst.txt
Normal file
@@ -0,0 +1,117 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _concrete:
|
||||
|
||||
**********************
|
||||
Concrete Objects Layer
|
||||
**********************
|
||||
|
||||
The functions in this chapter are specific to certain Python object types.
|
||||
Passing them an object of the wrong type is not a good idea; if you receive an
|
||||
object from a Python program and you are not sure that it has the right type,
|
||||
you must perform a type check first; for example, to check that an object is a
|
||||
dictionary, use :c:func:`PyDict_Check`. The chapter is structured like the
|
||||
"family tree" of Python object types.
|
||||
|
||||
.. warning::
|
||||
|
||||
While the functions described in this chapter carefully check the type of the
|
||||
objects which are passed in, many of them do not check for *NULL* being passed
|
||||
instead of a valid object. Allowing *NULL* to be passed in can cause memory
|
||||
access violations and immediate termination of the interpreter.
|
||||
|
||||
|
||||
.. _fundamental:
|
||||
|
||||
Fundamental Objects
|
||||
===================
|
||||
|
||||
This section describes Python type objects and the singleton object ``None``.
|
||||
|
||||
.. toctree::
|
||||
|
||||
type.rst
|
||||
none.rst
|
||||
|
||||
|
||||
.. _numericobjects:
|
||||
|
||||
Numeric Objects
|
||||
===============
|
||||
|
||||
.. index:: object: numeric
|
||||
|
||||
.. toctree::
|
||||
|
||||
long.rst
|
||||
bool.rst
|
||||
float.rst
|
||||
complex.rst
|
||||
|
||||
|
||||
.. _sequenceobjects:
|
||||
|
||||
Sequence Objects
|
||||
================
|
||||
|
||||
.. index:: object: sequence
|
||||
|
||||
Generic operations on sequence objects were discussed in the previous chapter;
|
||||
this section deals with the specific kinds of sequence objects that are
|
||||
intrinsic to the Python language.
|
||||
|
||||
.. XXX sort out unicode, str, bytes and bytearray
|
||||
|
||||
.. toctree::
|
||||
|
||||
bytes.rst
|
||||
bytearray.rst
|
||||
unicode.rst
|
||||
tuple.rst
|
||||
list.rst
|
||||
|
||||
|
||||
.. _mapobjects:
|
||||
|
||||
Container Objects
|
||||
=================
|
||||
|
||||
.. index:: object: mapping
|
||||
|
||||
.. toctree::
|
||||
|
||||
dict.rst
|
||||
set.rst
|
||||
|
||||
|
||||
.. _otherobjects:
|
||||
|
||||
Function Objects
|
||||
================
|
||||
|
||||
.. toctree::
|
||||
|
||||
function.rst
|
||||
method.rst
|
||||
cell.rst
|
||||
code.rst
|
||||
|
||||
|
||||
Other Objects
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
|
||||
file.rst
|
||||
module.rst
|
||||
iterator.rst
|
||||
descriptor.rst
|
||||
slice.rst
|
||||
memoryview.rst
|
||||
weakref.rst
|
||||
capsule.rst
|
||||
gen.rst
|
||||
coro.rst
|
||||
contextvars.rst
|
||||
datetime.rst
|
||||
144
python-3.7.4-docs-html/_sources/c-api/contextvars.rst.txt
Normal file
144
python-3.7.4-docs-html/_sources/c-api/contextvars.rst.txt
Normal file
@@ -0,0 +1,144 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _contextvarsobjects:
|
||||
|
||||
Context Variables Objects
|
||||
-------------------------
|
||||
|
||||
.. _contextvarsobjects_pointertype_change:
|
||||
.. versionchanged:: 3.7.1
|
||||
|
||||
.. note::
|
||||
|
||||
In Python 3.7.1 the signatures of all context variables
|
||||
C APIs were **changed** to use :c:type:`PyObject` pointers instead
|
||||
of :c:type:`PyContext`, :c:type:`PyContextVar`, and
|
||||
:c:type:`PyContextToken`, e.g.::
|
||||
|
||||
// in 3.7.0:
|
||||
PyContext *PyContext_New(void);
|
||||
|
||||
// in 3.7.1+:
|
||||
PyObject *PyContext_New(void);
|
||||
|
||||
See :issue:`34762` for more details.
|
||||
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
This section details the public C API for the :mod:`contextvars` module.
|
||||
|
||||
.. c:type:: PyContext
|
||||
|
||||
The C structure used to represent a :class:`contextvars.Context`
|
||||
object.
|
||||
|
||||
.. c:type:: PyContextVar
|
||||
|
||||
The C structure used to represent a :class:`contextvars.ContextVar`
|
||||
object.
|
||||
|
||||
.. c:type:: PyContextToken
|
||||
|
||||
The C structure used to represent a :class:`contextvars.Token` object.
|
||||
|
||||
.. c:var:: PyTypeObject PyContext_Type
|
||||
|
||||
The type object representing the *context* type.
|
||||
|
||||
.. c:var:: PyTypeObject PyContextVar_Type
|
||||
|
||||
The type object representing the *context variable* type.
|
||||
|
||||
.. c:var:: PyTypeObject PyContextToken_Type
|
||||
|
||||
The type object representing the *context variable token* type.
|
||||
|
||||
|
||||
Type-check macros:
|
||||
|
||||
.. c:function:: int PyContext_CheckExact(PyObject *o)
|
||||
|
||||
Return true if *o* is of type :c:data:`PyContext_Type`. *o* must not be
|
||||
*NULL*. This function always succeeds.
|
||||
|
||||
.. c:function:: int PyContextVar_CheckExact(PyObject *o)
|
||||
|
||||
Return true if *o* is of type :c:data:`PyContextVar_Type`. *o* must not be
|
||||
*NULL*. This function always succeeds.
|
||||
|
||||
.. c:function:: int PyContextToken_CheckExact(PyObject *o)
|
||||
|
||||
Return true if *o* is of type :c:data:`PyContextToken_Type`.
|
||||
*o* must not be *NULL*. This function always succeeds.
|
||||
|
||||
|
||||
Context object management functions:
|
||||
|
||||
.. c:function:: PyObject *PyContext_New(void)
|
||||
|
||||
Create a new empty context object. Returns ``NULL`` if an error
|
||||
has occurred.
|
||||
|
||||
.. c:function:: PyObject *PyContext_Copy(PyObject *ctx)
|
||||
|
||||
Create a shallow copy of the passed *ctx* context object.
|
||||
Returns ``NULL`` if an error has occurred.
|
||||
|
||||
.. c:function:: PyObject *PyContext_CopyCurrent(void)
|
||||
|
||||
Create a shallow copy of the current thread context.
|
||||
Returns ``NULL`` if an error has occurred.
|
||||
|
||||
.. c:function:: int PyContext_Enter(PyObject *ctx)
|
||||
|
||||
Set *ctx* as the current context for the current thread.
|
||||
Returns ``0`` on success, and ``-1`` on error.
|
||||
|
||||
.. c:function:: int PyContext_Exit(PyObject *ctx)
|
||||
|
||||
Deactivate the *ctx* context and restore the previous context as the
|
||||
current context for the current thread. Returns ``0`` on success,
|
||||
and ``-1`` on error.
|
||||
|
||||
.. c:function:: int PyContext_ClearFreeList()
|
||||
|
||||
Clear the context variable free list. Return the total number of
|
||||
freed items. This function always succeeds.
|
||||
|
||||
|
||||
Context variable functions:
|
||||
|
||||
.. c:function:: PyObject *PyContextVar_New(const char *name, PyObject *def)
|
||||
|
||||
Create a new ``ContextVar`` object. The *name* parameter is used
|
||||
for introspection and debug purposes. The *def* parameter may optionally
|
||||
specify the default value for the context variable. If an error has
|
||||
occurred, this function returns ``NULL``.
|
||||
|
||||
.. c:function:: int PyContextVar_Get(PyObject *var, PyObject *default_value, PyObject **value)
|
||||
|
||||
Get the value of a context variable. Returns ``-1`` if an error has
|
||||
occurred during lookup, and ``0`` if no error occurred, whether or not
|
||||
a value was found.
|
||||
|
||||
If the context variable was found, *value* will be a pointer to it.
|
||||
If the context variable was *not* found, *value* will point to:
|
||||
|
||||
- *default_value*, if not ``NULL``;
|
||||
- the default value of *var*, if not ``NULL``;
|
||||
- ``NULL``
|
||||
|
||||
If the value was found, the function will create a new reference to it.
|
||||
|
||||
.. c:function:: PyObject *PyContextVar_Set(PyObject *var, PyObject *value)
|
||||
|
||||
Set the value of *var* to *value* in the current context. Returns a
|
||||
pointer to a :c:type:`PyObject` object, or ``NULL`` if an error
|
||||
has occurred.
|
||||
|
||||
.. c:function:: int PyContextVar_Reset(PyObject *var, PyObject *token)
|
||||
|
||||
Reset the state of the *var* context variable to that it was in before
|
||||
:c:func:`PyContextVar_Set` that returned the *token* was called.
|
||||
This function returns ``0`` on success and ``-1`` on error.
|
||||
131
python-3.7.4-docs-html/_sources/c-api/conversion.rst.txt
Normal file
131
python-3.7.4-docs-html/_sources/c-api/conversion.rst.txt
Normal file
@@ -0,0 +1,131 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _string-conversion:
|
||||
|
||||
String conversion and formatting
|
||||
================================
|
||||
|
||||
Functions for number conversion and formatted string output.
|
||||
|
||||
|
||||
.. c:function:: int PyOS_snprintf(char *str, size_t size, const char *format, ...)
|
||||
|
||||
Output not more than *size* bytes to *str* according to the format string
|
||||
*format* and the extra arguments. See the Unix man page :manpage:`snprintf(2)`.
|
||||
|
||||
|
||||
.. c:function:: int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
|
||||
|
||||
Output not more than *size* bytes to *str* according to the format string
|
||||
*format* and the variable argument list *va*. Unix man page
|
||||
:manpage:`vsnprintf(2)`.
|
||||
|
||||
:c:func:`PyOS_snprintf` and :c:func:`PyOS_vsnprintf` wrap the Standard C library
|
||||
functions :c:func:`snprintf` and :c:func:`vsnprintf`. Their purpose is to
|
||||
guarantee consistent behavior in corner cases, which the Standard C functions do
|
||||
not.
|
||||
|
||||
The wrappers ensure that *str*[*size*-1] is always ``'\0'`` upon return. They
|
||||
never write more than *size* bytes (including the trailing ``'\0'``) into str.
|
||||
Both functions require that ``str != NULL``, ``size > 0`` and ``format !=
|
||||
NULL``.
|
||||
|
||||
If the platform doesn't have :c:func:`vsnprintf` and the buffer size needed to
|
||||
avoid truncation exceeds *size* by more than 512 bytes, Python aborts with a
|
||||
*Py_FatalError*.
|
||||
|
||||
The return value (*rv*) for these functions should be interpreted as follows:
|
||||
|
||||
* When ``0 <= rv < size``, the output conversion was successful and *rv*
|
||||
characters were written to *str* (excluding the trailing ``'\0'`` byte at
|
||||
*str*[*rv*]).
|
||||
|
||||
* When ``rv >= size``, the output conversion was truncated and a buffer with
|
||||
``rv + 1`` bytes would have been needed to succeed. *str*[*size*-1] is ``'\0'``
|
||||
in this case.
|
||||
|
||||
* When ``rv < 0``, "something bad happened." *str*[*size*-1] is ``'\0'`` in
|
||||
this case too, but the rest of *str* is undefined. The exact cause of the error
|
||||
depends on the underlying platform.
|
||||
|
||||
The following functions provide locale-independent string to number conversions.
|
||||
|
||||
|
||||
.. c:function:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
|
||||
|
||||
Convert a string ``s`` to a :c:type:`double`, raising a Python
|
||||
exception on failure. The set of accepted strings corresponds to
|
||||
the set of strings accepted by Python's :func:`float` constructor,
|
||||
except that ``s`` must not have leading or trailing whitespace.
|
||||
The conversion is independent of the current locale.
|
||||
|
||||
If ``endptr`` is ``NULL``, convert the whole string. Raise
|
||||
:exc:`ValueError` and return ``-1.0`` if the string is not a valid
|
||||
representation of a floating-point number.
|
||||
|
||||
If endptr is not ``NULL``, convert as much of the string as
|
||||
possible and set ``*endptr`` to point to the first unconverted
|
||||
character. If no initial segment of the string is the valid
|
||||
representation of a floating-point number, set ``*endptr`` to point
|
||||
to the beginning of the string, raise ValueError, and return
|
||||
``-1.0``.
|
||||
|
||||
If ``s`` represents a value that is too large to store in a float
|
||||
(for example, ``"1e500"`` is such a string on many platforms) then
|
||||
if ``overflow_exception`` is ``NULL`` return ``Py_HUGE_VAL`` (with
|
||||
an appropriate sign) and don't set any exception. Otherwise,
|
||||
``overflow_exception`` must point to a Python exception object;
|
||||
raise that exception and return ``-1.0``. In both cases, set
|
||||
``*endptr`` to point to the first character after the converted value.
|
||||
|
||||
If any other error occurs during the conversion (for example an
|
||||
out-of-memory error), set the appropriate Python exception and
|
||||
return ``-1.0``.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
|
||||
|
||||
.. c:function:: char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)
|
||||
|
||||
Convert a :c:type:`double` *val* to a string using supplied
|
||||
*format_code*, *precision*, and *flags*.
|
||||
|
||||
*format_code* must be one of ``'e'``, ``'E'``, ``'f'``, ``'F'``,
|
||||
``'g'``, ``'G'`` or ``'r'``. For ``'r'``, the supplied *precision*
|
||||
must be 0 and is ignored. The ``'r'`` format code specifies the
|
||||
standard :func:`repr` format.
|
||||
|
||||
*flags* can be zero or more of the values *Py_DTSF_SIGN*,
|
||||
*Py_DTSF_ADD_DOT_0*, or *Py_DTSF_ALT*, or-ed together:
|
||||
|
||||
* *Py_DTSF_SIGN* means to always precede the returned string with a sign
|
||||
character, even if *val* is non-negative.
|
||||
|
||||
* *Py_DTSF_ADD_DOT_0* means to ensure that the returned string will not look
|
||||
like an integer.
|
||||
|
||||
* *Py_DTSF_ALT* means to apply "alternate" formatting rules. See the
|
||||
documentation for the :c:func:`PyOS_snprintf` ``'#'`` specifier for
|
||||
details.
|
||||
|
||||
If *ptype* is non-NULL, then the value it points to will be set to one of
|
||||
*Py_DTST_FINITE*, *Py_DTST_INFINITE*, or *Py_DTST_NAN*, signifying that
|
||||
*val* is a finite number, an infinite number, or not a number, respectively.
|
||||
|
||||
The return value is a pointer to *buffer* with the converted string or
|
||||
*NULL* if the conversion failed. The caller is responsible for freeing the
|
||||
returned string by calling :c:func:`PyMem_Free`.
|
||||
|
||||
.. versionadded:: 3.1
|
||||
|
||||
|
||||
.. c:function:: int PyOS_stricmp(const char *s1, const char *s2)
|
||||
|
||||
Case insensitive comparison of strings. The function works almost
|
||||
identically to :c:func:`strcmp` except that it ignores the case.
|
||||
|
||||
|
||||
.. c:function:: int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size)
|
||||
|
||||
Case insensitive comparison of strings. The function works almost
|
||||
identically to :c:func:`strncmp` except that it ignores the case.
|
||||
34
python-3.7.4-docs-html/_sources/c-api/coro.rst.txt
Normal file
34
python-3.7.4-docs-html/_sources/c-api/coro.rst.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _coro-objects:
|
||||
|
||||
Coroutine Objects
|
||||
-----------------
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
Coroutine objects are what functions declared with an ``async`` keyword
|
||||
return.
|
||||
|
||||
|
||||
.. c:type:: PyCoroObject
|
||||
|
||||
The C structure used for coroutine objects.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyCoro_Type
|
||||
|
||||
The type object corresponding to coroutine objects.
|
||||
|
||||
|
||||
.. c:function:: int PyCoro_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob*'s type is *PyCoro_Type*; *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCoro_New(PyFrameObject *frame, PyObject *name, PyObject *qualname)
|
||||
|
||||
Create and return a new coroutine object based on the *frame* object,
|
||||
with ``__name__`` and ``__qualname__`` set to *name* and *qualname*.
|
||||
A reference to *frame* is stolen by this function. The *frame* argument
|
||||
must not be *NULL*.
|
||||
249
python-3.7.4-docs-html/_sources/c-api/datetime.rst.txt
Normal file
249
python-3.7.4-docs-html/_sources/c-api/datetime.rst.txt
Normal file
@@ -0,0 +1,249 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _datetimeobjects:
|
||||
|
||||
DateTime Objects
|
||||
----------------
|
||||
|
||||
Various date and time objects are supplied by the :mod:`datetime` module.
|
||||
Before using any of these functions, the header file :file:`datetime.h` must be
|
||||
included in your source (note that this is not included by :file:`Python.h`),
|
||||
and the macro :c:macro:`PyDateTime_IMPORT` must be invoked, usually as part of
|
||||
the module initialisation function. The macro puts a pointer to a C structure
|
||||
into a static variable, :c:data:`PyDateTimeAPI`, that is used by the following
|
||||
macros.
|
||||
|
||||
Macro for access to the UTC singleton:
|
||||
|
||||
.. c:var:: PyObject* PyDateTime_TimeZone_UTC
|
||||
|
||||
Returns the time zone singleton representing UTC, the same object as
|
||||
:attr:`datetime.timezone.utc`.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
Type-check macros:
|
||||
|
||||
.. c:function:: int PyDate_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DateType` or a subtype of
|
||||
:c:data:`PyDateTime_DateType`. *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyDate_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DateType`. *ob* must not be
|
||||
*NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType` or a subtype of
|
||||
:c:data:`PyDateTime_DateTimeType`. *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType`. *ob* must not
|
||||
be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyTime_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_TimeType` or a subtype of
|
||||
:c:data:`PyDateTime_TimeType`. *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyTime_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_TimeType`. *ob* must not be
|
||||
*NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyDelta_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DeltaType` or a subtype of
|
||||
:c:data:`PyDateTime_DeltaType`. *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyDelta_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_DeltaType`. *ob* must not be
|
||||
*NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyTZInfo_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType` or a subtype of
|
||||
:c:data:`PyDateTime_TZInfoType`. *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyTZInfo_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType`. *ob* must not be
|
||||
*NULL*.
|
||||
|
||||
|
||||
Macros to create objects:
|
||||
|
||||
.. c:function:: PyObject* PyDate_FromDate(int year, int month, int day)
|
||||
|
||||
Return a :class:`datetime.date` object with the specified year, month and day.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDateTime_FromDateAndTime(int year, int month, int day, int hour, int minute, int second, int usecond)
|
||||
|
||||
Return a :class:`datetime.datetime` object with the specified year, month, day, hour,
|
||||
minute, second and microsecond.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDateTime_FromDateAndTimeAndFold(int year, int month, int day, int hour, int minute, int second, int usecond, int fold)
|
||||
|
||||
Return a :class:`datetime.datetime` object with the specified year, month, day, hour,
|
||||
minute, second, microsecond and fold.
|
||||
|
||||
.. versionadded:: 3.6
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTime_FromTime(int hour, int minute, int second, int usecond)
|
||||
|
||||
Return a :class:`datetime.time` object with the specified hour, minute, second and
|
||||
microsecond.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTime_FromTimeAndFold(int hour, int minute, int second, int usecond, int fold)
|
||||
|
||||
Return a :class:`datetime.time` object with the specified hour, minute, second,
|
||||
microsecond and fold.
|
||||
|
||||
.. versionadded:: 3.6
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDelta_FromDSU(int days, int seconds, int useconds)
|
||||
|
||||
Return a :class:`datetime.timedelta` object representing the given number
|
||||
of days, seconds and microseconds. Normalization is performed so that the
|
||||
resulting number of microseconds and seconds lie in the ranges documented for
|
||||
:class:`datetime.timedelta` objects.
|
||||
|
||||
.. c:function:: PyObject* PyTimeZone_FromOffset(PyDateTime_DeltaType* offset)
|
||||
|
||||
Return a :class:`datetime.timezone` object with an unnamed fixed offset
|
||||
represented by the *offset* argument.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. c:function:: PyObject* PyTimeZone_FromOffsetAndName(PyDateTime_DeltaType* offset, PyUnicode* name)
|
||||
|
||||
Return a :class:`datetime.timezone` object with a fixed offset represented
|
||||
by the *offset* argument and with tzname *name*.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
Macros to extract fields from date objects. The argument must be an instance of
|
||||
:c:data:`PyDateTime_Date`, including subclasses (such as
|
||||
:c:data:`PyDateTime_DateTime`). The argument must not be *NULL*, and the type is
|
||||
not checked:
|
||||
|
||||
.. c:function:: int PyDateTime_GET_YEAR(PyDateTime_Date *o)
|
||||
|
||||
Return the year, as a positive int.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_GET_MONTH(PyDateTime_Date *o)
|
||||
|
||||
Return the month, as an int from 1 through 12.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_GET_DAY(PyDateTime_Date *o)
|
||||
|
||||
Return the day, as an int from 1 through 31.
|
||||
|
||||
|
||||
Macros to extract fields from datetime objects. The argument must be an
|
||||
instance of :c:data:`PyDateTime_DateTime`, including subclasses. The argument
|
||||
must not be *NULL*, and the type is not checked:
|
||||
|
||||
.. c:function:: int PyDateTime_DATE_GET_HOUR(PyDateTime_DateTime *o)
|
||||
|
||||
Return the hour, as an int from 0 through 23.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_DATE_GET_MINUTE(PyDateTime_DateTime *o)
|
||||
|
||||
Return the minute, as an int from 0 through 59.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_DATE_GET_SECOND(PyDateTime_DateTime *o)
|
||||
|
||||
Return the second, as an int from 0 through 59.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_DATE_GET_MICROSECOND(PyDateTime_DateTime *o)
|
||||
|
||||
Return the microsecond, as an int from 0 through 999999.
|
||||
|
||||
|
||||
Macros to extract fields from time objects. The argument must be an instance of
|
||||
:c:data:`PyDateTime_Time`, including subclasses. The argument must not be *NULL*,
|
||||
and the type is not checked:
|
||||
|
||||
.. c:function:: int PyDateTime_TIME_GET_HOUR(PyDateTime_Time *o)
|
||||
|
||||
Return the hour, as an int from 0 through 23.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_TIME_GET_MINUTE(PyDateTime_Time *o)
|
||||
|
||||
Return the minute, as an int from 0 through 59.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_TIME_GET_SECOND(PyDateTime_Time *o)
|
||||
|
||||
Return the second, as an int from 0 through 59.
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_TIME_GET_MICROSECOND(PyDateTime_Time *o)
|
||||
|
||||
Return the microsecond, as an int from 0 through 999999.
|
||||
|
||||
|
||||
Macros to extract fields from time delta objects. The argument must be an
|
||||
instance of :c:data:`PyDateTime_Delta`, including subclasses. The argument must
|
||||
not be *NULL*, and the type is not checked:
|
||||
|
||||
.. c:function:: int PyDateTime_DELTA_GET_DAYS(PyDateTime_Delta *o)
|
||||
|
||||
Return the number of days, as an int from -999999999 to 999999999.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_DELTA_GET_SECONDS(PyDateTime_Delta *o)
|
||||
|
||||
Return the number of seconds, as an int from 0 through 86399.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: int PyDateTime_DELTA_GET_MICROSECONDS(PyDateTime_Delta *o)
|
||||
|
||||
Return the number of microseconds, as an int from 0 through 999999.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
Macros for the convenience of modules implementing the DB API:
|
||||
|
||||
.. c:function:: PyObject* PyDateTime_FromTimestamp(PyObject *args)
|
||||
|
||||
Create and return a new :class:`datetime.datetime` object given an argument
|
||||
tuple suitable for passing to :meth:`datetime.datetime.fromtimestamp()`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDate_FromTimestamp(PyObject *args)
|
||||
|
||||
Create and return a new :class:`datetime.date` object given an argument
|
||||
tuple suitable for passing to :meth:`datetime.date.fromtimestamp()`.
|
||||
40
python-3.7.4-docs-html/_sources/c-api/descriptor.rst.txt
Normal file
40
python-3.7.4-docs-html/_sources/c-api/descriptor.rst.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _descriptor-objects:
|
||||
|
||||
Descriptor Objects
|
||||
------------------
|
||||
|
||||
"Descriptors" are objects that describe some attribute of an object. They are
|
||||
found in the dictionary of type objects.
|
||||
|
||||
.. XXX document these!
|
||||
|
||||
.. c:var:: PyTypeObject PyProperty_Type
|
||||
|
||||
The type object for the built-in descriptor types.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDescr_NewGetSet(PyTypeObject *type, struct PyGetSetDef *getset)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDescr_NewMember(PyTypeObject *type, struct PyMemberDef *meth)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDescr_NewMethod(PyTypeObject *type, struct PyMethodDef *meth)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *wrapper, void *wrapped)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)
|
||||
|
||||
|
||||
.. c:function:: int PyDescr_IsData(PyObject *descr)
|
||||
|
||||
Return true if the descriptor objects *descr* describes a data attribute, or
|
||||
false if it describes a method. *descr* must be a descriptor object; there is
|
||||
no error checking.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyWrapper_New(PyObject *, PyObject *)
|
||||
240
python-3.7.4-docs-html/_sources/c-api/dict.rst.txt
Normal file
240
python-3.7.4-docs-html/_sources/c-api/dict.rst.txt
Normal file
@@ -0,0 +1,240 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _dictobjects:
|
||||
|
||||
Dictionary Objects
|
||||
------------------
|
||||
|
||||
.. index:: object: dictionary
|
||||
|
||||
|
||||
.. c:type:: PyDictObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python dictionary object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyDict_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python dictionary
|
||||
type. This is the same object as :class:`dict` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a dict object or an instance of a subtype of the dict
|
||||
type.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a dict object, but not an instance of a subtype of
|
||||
the dict type.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_New()
|
||||
|
||||
Return a new empty dictionary, or *NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDictProxy_New(PyObject *mapping)
|
||||
|
||||
Return a :class:`types.MappingProxyType` object for a mapping which
|
||||
enforces read-only behavior. This is normally used to create a view to
|
||||
prevent modification of the dictionary for non-dynamic class types.
|
||||
|
||||
|
||||
.. c:function:: void PyDict_Clear(PyObject *p)
|
||||
|
||||
Empty an existing dictionary of all key-value pairs.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_Contains(PyObject *p, PyObject *key)
|
||||
|
||||
Determine if dictionary *p* contains *key*. If an item in *p* is matches
|
||||
*key*, return ``1``, otherwise return ``0``. On error, return ``-1``.
|
||||
This is equivalent to the Python expression ``key in p``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_Copy(PyObject *p)
|
||||
|
||||
Return a new dictionary that contains the same key-value pairs as *p*.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)
|
||||
|
||||
Insert *value* into the dictionary *p* with a key of *key*. *key* must be
|
||||
:term:`hashable`; if it isn't, :exc:`TypeError` will be raised. Return
|
||||
``0`` on success or ``-1`` on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
|
||||
|
||||
.. index:: single: PyUnicode_FromString()
|
||||
|
||||
Insert *value* into the dictionary *p* using *key* as a key. *key* should
|
||||
be a :c:type:`const char\*`. The key object is created using
|
||||
``PyUnicode_FromString(key)``. Return ``0`` on success or ``-1`` on
|
||||
failure.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_DelItem(PyObject *p, PyObject *key)
|
||||
|
||||
Remove the entry in dictionary *p* with key *key*. *key* must be hashable;
|
||||
if it isn't, :exc:`TypeError` is raised. Return ``0`` on success or ``-1``
|
||||
on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_DelItemString(PyObject *p, const char *key)
|
||||
|
||||
Remove the entry in dictionary *p* which has a key specified by the string
|
||||
*key*. Return ``0`` on success or ``-1`` on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key)
|
||||
|
||||
Return the object from dictionary *p* which has a key *key*. Return *NULL*
|
||||
if the key *key* is not present, but *without* setting an exception.
|
||||
|
||||
Note that exceptions which occur while calling :meth:`__hash__` and
|
||||
:meth:`__eq__` methods will get suppressed.
|
||||
To get error reporting use :c:func:`PyDict_GetItemWithError()` instead.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_GetItemWithError(PyObject *p, PyObject *key)
|
||||
|
||||
Variant of :c:func:`PyDict_GetItem` that does not suppress
|
||||
exceptions. Return *NULL* **with** an exception set if an exception
|
||||
occurred. Return *NULL* **without** an exception set if the key
|
||||
wasn't present.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_GetItemString(PyObject *p, const char *key)
|
||||
|
||||
This is the same as :c:func:`PyDict_GetItem`, but *key* is specified as a
|
||||
:c:type:`const char\*`, rather than a :c:type:`PyObject\*`.
|
||||
|
||||
Note that exceptions which occur while calling :meth:`__hash__` and
|
||||
:meth:`__eq__` methods and creating a temporary string object
|
||||
will get suppressed.
|
||||
To get error reporting use :c:func:`PyDict_GetItemWithError()` instead.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)
|
||||
|
||||
This is the same as the Python-level :meth:`dict.setdefault`. If present, it
|
||||
returns the value corresponding to *key* from the dictionary *p*. If the key
|
||||
is not in the dict, it is inserted with value *defaultobj* and *defaultobj*
|
||||
is returned. This function evaluates the hash function of *key* only once,
|
||||
instead of evaluating it independently for the lookup and the insertion.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. c:function:: PyObject* PyDict_Items(PyObject *p)
|
||||
|
||||
Return a :c:type:`PyListObject` containing all the items from the dictionary.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_Keys(PyObject *p)
|
||||
|
||||
Return a :c:type:`PyListObject` containing all the keys from the dictionary.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyDict_Values(PyObject *p)
|
||||
|
||||
Return a :c:type:`PyListObject` containing all the values from the dictionary
|
||||
*p*.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyDict_Size(PyObject *p)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Return the number of items in the dictionary. This is equivalent to
|
||||
``len(p)`` on a dictionary.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
|
||||
|
||||
Iterate over all key-value pairs in the dictionary *p*. The
|
||||
:c:type:`Py_ssize_t` referred to by *ppos* must be initialized to ``0``
|
||||
prior to the first call to this function to start the iteration; the
|
||||
function returns true for each pair in the dictionary, and false once all
|
||||
pairs have been reported. The parameters *pkey* and *pvalue* should either
|
||||
point to :c:type:`PyObject\*` variables that will be filled in with each key
|
||||
and value, respectively, or may be *NULL*. Any references returned through
|
||||
them are borrowed. *ppos* should not be altered during iteration. Its
|
||||
value represents offsets within the internal dictionary structure, and
|
||||
since the structure is sparse, the offsets are not consecutive.
|
||||
|
||||
For example::
|
||||
|
||||
PyObject *key, *value;
|
||||
Py_ssize_t pos = 0;
|
||||
|
||||
while (PyDict_Next(self->dict, &pos, &key, &value)) {
|
||||
/* do something interesting with the values... */
|
||||
...
|
||||
}
|
||||
|
||||
The dictionary *p* should not be mutated during iteration. It is safe to
|
||||
modify the values of the keys as you iterate over the dictionary, but only
|
||||
so long as the set of keys does not change. For example::
|
||||
|
||||
PyObject *key, *value;
|
||||
Py_ssize_t pos = 0;
|
||||
|
||||
while (PyDict_Next(self->dict, &pos, &key, &value)) {
|
||||
long i = PyLong_AsLong(value);
|
||||
if (i == -1 && PyErr_Occurred()) {
|
||||
return -1;
|
||||
}
|
||||
PyObject *o = PyLong_FromLong(i + 1);
|
||||
if (o == NULL)
|
||||
return -1;
|
||||
if (PyDict_SetItem(self->dict, key, o) < 0) {
|
||||
Py_DECREF(o);
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(o);
|
||||
}
|
||||
|
||||
|
||||
.. c:function:: int PyDict_Merge(PyObject *a, PyObject *b, int override)
|
||||
|
||||
Iterate over mapping object *b* adding key-value pairs to dictionary *a*.
|
||||
*b* may be a dictionary, or any object supporting :c:func:`PyMapping_Keys`
|
||||
and :c:func:`PyObject_GetItem`. If *override* is true, existing pairs in *a*
|
||||
will be replaced if a matching key is found in *b*, otherwise pairs will
|
||||
only be added if there is not a matching key in *a*. Return ``0`` on
|
||||
success or ``-1`` if an exception was raised.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_Update(PyObject *a, PyObject *b)
|
||||
|
||||
This is the same as ``PyDict_Merge(a, b, 1)`` in C, and is similar to
|
||||
``a.update(b)`` in Python except that :c:func:`PyDict_Update` doesn't fall
|
||||
back to the iterating over a sequence of key value pairs if the second
|
||||
argument has no "keys" attribute. Return ``0`` on success or ``-1`` if an
|
||||
exception was raised.
|
||||
|
||||
|
||||
.. c:function:: int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)
|
||||
|
||||
Update or merge into dictionary *a*, from the key-value pairs in *seq2*.
|
||||
*seq2* must be an iterable object producing iterable objects of length 2,
|
||||
viewed as key-value pairs. In case of duplicate keys, the last wins if
|
||||
*override* is true, else the first wins. Return ``0`` on success or ``-1``
|
||||
if an exception was raised. Equivalent Python (except for the return
|
||||
value)::
|
||||
|
||||
def PyDict_MergeFromSeq2(a, seq2, override):
|
||||
for key, value in seq2:
|
||||
if override or key not in a:
|
||||
a[key] = value
|
||||
|
||||
|
||||
.. c:function:: int PyDict_ClearFreeList()
|
||||
|
||||
Clear the free list. Return the total number of freed items.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
1032
python-3.7.4-docs-html/_sources/c-api/exceptions.rst.txt
Normal file
1032
python-3.7.4-docs-html/_sources/c-api/exceptions.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
76
python-3.7.4-docs-html/_sources/c-api/file.rst.txt
Normal file
76
python-3.7.4-docs-html/_sources/c-api/file.rst.txt
Normal file
@@ -0,0 +1,76 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _fileobjects:
|
||||
|
||||
File Objects
|
||||
------------
|
||||
|
||||
.. index:: object: file
|
||||
|
||||
These APIs are a minimal emulation of the Python 2 C API for built-in file
|
||||
objects, which used to rely on the buffered I/O (:c:type:`FILE\*`) support
|
||||
from the C standard library. In Python 3, files and streams use the new
|
||||
:mod:`io` module, which defines several layers over the low-level unbuffered
|
||||
I/O of the operating system. The functions described below are
|
||||
convenience C wrappers over these new APIs, and meant mostly for internal
|
||||
error reporting in the interpreter; third-party code is advised to access
|
||||
the :mod:`io` APIs instead.
|
||||
|
||||
|
||||
.. c:function:: PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const char *encoding, const char *errors, const char *newline, int closefd)
|
||||
|
||||
Create a Python file object from the file descriptor of an already
|
||||
opened file *fd*. The arguments *name*, *encoding*, *errors* and *newline*
|
||||
can be *NULL* to use the defaults; *buffering* can be *-1* to use the
|
||||
default. *name* is ignored and kept for backward compatibility. Return
|
||||
*NULL* on failure. For a more comprehensive description of the arguments,
|
||||
please refer to the :func:`io.open` function documentation.
|
||||
|
||||
.. warning::
|
||||
|
||||
Since Python streams have their own buffering layer, mixing them with
|
||||
OS-level file descriptors can produce various issues (such as unexpected
|
||||
ordering of data).
|
||||
|
||||
.. versionchanged:: 3.2
|
||||
Ignore *name* attribute.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_AsFileDescriptor(PyObject *p)
|
||||
|
||||
Return the file descriptor associated with *p* as an :c:type:`int`. If the
|
||||
object is an integer, its value is returned. If not, the
|
||||
object's :meth:`~io.IOBase.fileno` method is called if it exists; the
|
||||
method must return an integer, which is returned as the file descriptor
|
||||
value. Sets an exception and returns ``-1`` on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFile_GetLine(PyObject *p, int n)
|
||||
|
||||
.. index:: single: EOFError (built-in exception)
|
||||
|
||||
Equivalent to ``p.readline([n])``, this function reads one line from the
|
||||
object *p*. *p* may be a file object or any object with a
|
||||
:meth:`~io.IOBase.readline`
|
||||
method. If *n* is ``0``, exactly one line is read, regardless of the length of
|
||||
the line. If *n* is greater than ``0``, no more than *n* bytes will be read
|
||||
from the file; a partial line can be returned. In both cases, an empty string
|
||||
is returned if the end of the file is reached immediately. If *n* is less than
|
||||
``0``, however, one line is read regardless of length, but :exc:`EOFError` is
|
||||
raised if the end of the file is reached immediately.
|
||||
|
||||
|
||||
.. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)
|
||||
|
||||
.. index:: single: Py_PRINT_RAW
|
||||
|
||||
Write object *obj* to file object *p*. The only supported flag for *flags* is
|
||||
:const:`Py_PRINT_RAW`; if given, the :func:`str` of the object is written
|
||||
instead of the :func:`repr`. Return ``0`` on success or ``-1`` on failure; the
|
||||
appropriate exception will be set.
|
||||
|
||||
|
||||
.. c:function:: int PyFile_WriteString(const char *s, PyObject *p)
|
||||
|
||||
Write string *s* to file object *p*. Return ``0`` on success or ``-1`` on
|
||||
failure; the appropriate exception will be set.
|
||||
79
python-3.7.4-docs-html/_sources/c-api/float.rst.txt
Normal file
79
python-3.7.4-docs-html/_sources/c-api/float.rst.txt
Normal file
@@ -0,0 +1,79 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _floatobjects:
|
||||
|
||||
Floating Point Objects
|
||||
----------------------
|
||||
|
||||
.. index:: object: floating point
|
||||
|
||||
|
||||
.. c:type:: PyFloatObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python floating point object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyFloat_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python floating point
|
||||
type. This is the same object as :class:`float` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyFloat_Check(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyFloatObject` or a subtype of
|
||||
:c:type:`PyFloatObject`.
|
||||
|
||||
|
||||
.. c:function:: int PyFloat_CheckExact(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyFloatObject`, but not a subtype of
|
||||
:c:type:`PyFloatObject`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFloat_FromString(PyObject *str)
|
||||
|
||||
Create a :c:type:`PyFloatObject` object based on the string value in *str*, or
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFloat_FromDouble(double v)
|
||||
|
||||
Create a :c:type:`PyFloatObject` object from *v*, or *NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: double PyFloat_AsDouble(PyObject *pyfloat)
|
||||
|
||||
Return a C :c:type:`double` representation of the contents of *pyfloat*. If
|
||||
*pyfloat* is not a Python floating point object but has a :meth:`__float__`
|
||||
method, this method will first be called to convert *pyfloat* into a float.
|
||||
This method returns ``-1.0`` upon failure, so one should call
|
||||
:c:func:`PyErr_Occurred` to check for errors.
|
||||
|
||||
|
||||
.. c:function:: double PyFloat_AS_DOUBLE(PyObject *pyfloat)
|
||||
|
||||
Return a C :c:type:`double` representation of the contents of *pyfloat*, but
|
||||
without error checking.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFloat_GetInfo(void)
|
||||
|
||||
Return a structseq instance which contains information about the
|
||||
precision, minimum and maximum values of a float. It's a thin wrapper
|
||||
around the header file :file:`float.h`.
|
||||
|
||||
|
||||
.. c:function:: double PyFloat_GetMax()
|
||||
|
||||
Return the maximum representable finite float *DBL_MAX* as C :c:type:`double`.
|
||||
|
||||
|
||||
.. c:function:: double PyFloat_GetMin()
|
||||
|
||||
Return the minimum normalized positive float *DBL_MIN* as C :c:type:`double`.
|
||||
|
||||
.. c:function:: int PyFloat_ClearFreeList()
|
||||
|
||||
Clear the float free list. Return the number of items that could not
|
||||
be freed.
|
||||
108
python-3.7.4-docs-html/_sources/c-api/function.rst.txt
Normal file
108
python-3.7.4-docs-html/_sources/c-api/function.rst.txt
Normal file
@@ -0,0 +1,108 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _function-objects:
|
||||
|
||||
Function Objects
|
||||
----------------
|
||||
|
||||
.. index:: object: function
|
||||
|
||||
There are a few functions specific to Python functions.
|
||||
|
||||
|
||||
.. c:type:: PyFunctionObject
|
||||
|
||||
The C structure used for functions.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyFunction_Type
|
||||
|
||||
.. index:: single: MethodType (in module types)
|
||||
|
||||
This is an instance of :c:type:`PyTypeObject` and represents the Python function
|
||||
type. It is exposed to Python programmers as ``types.FunctionType``.
|
||||
|
||||
|
||||
.. c:function:: int PyFunction_Check(PyObject *o)
|
||||
|
||||
Return true if *o* is a function object (has type :c:data:`PyFunction_Type`).
|
||||
The parameter must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_New(PyObject *code, PyObject *globals)
|
||||
|
||||
Return a new function object associated with the code object *code*. *globals*
|
||||
must be a dictionary with the global variables accessible to the function.
|
||||
|
||||
The function's docstring and name are retrieved from the code object. *__module__*
|
||||
is retrieved from *globals*. The argument defaults, annotations and closure are
|
||||
set to *NULL*. *__qualname__* is set to the same value as the function's name.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
|
||||
|
||||
As :c:func:`PyFunction_New`, but also allows setting the function object's
|
||||
``__qualname__`` attribute. *qualname* should be a unicode object or NULL;
|
||||
if NULL, the ``__qualname__`` attribute is set to the same value as its
|
||||
``__name__`` attribute.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_GetCode(PyObject *op)
|
||||
|
||||
Return the code object associated with the function object *op*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_GetGlobals(PyObject *op)
|
||||
|
||||
Return the globals dictionary associated with the function object *op*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_GetModule(PyObject *op)
|
||||
|
||||
Return the *__module__* attribute of the function object *op*. This is normally
|
||||
a string containing the module name, but can be set to any other object by
|
||||
Python code.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op)
|
||||
|
||||
Return the argument default values of the function object *op*. This can be a
|
||||
tuple of arguments or *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
|
||||
|
||||
Set the argument default values for the function object *op*. *defaults* must be
|
||||
*Py_None* or a tuple.
|
||||
|
||||
Raises :exc:`SystemError` and returns ``-1`` on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFunction_GetClosure(PyObject *op)
|
||||
|
||||
Return the closure associated with the function object *op*. This can be *NULL*
|
||||
or a tuple of cell objects.
|
||||
|
||||
|
||||
.. c:function:: int PyFunction_SetClosure(PyObject *op, PyObject *closure)
|
||||
|
||||
Set the closure associated with the function object *op*. *closure* must be
|
||||
*Py_None* or a tuple of cell objects.
|
||||
|
||||
Raises :exc:`SystemError` and returns ``-1`` on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject *PyFunction_GetAnnotations(PyObject *op)
|
||||
|
||||
Return the annotations of the function object *op*. This can be a
|
||||
mutable dictionary or *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
|
||||
|
||||
Set the annotations for the function object *op*. *annotations*
|
||||
must be a dictionary or *Py_None*.
|
||||
|
||||
Raises :exc:`SystemError` and returns ``-1`` on failure.
|
||||
159
python-3.7.4-docs-html/_sources/c-api/gcsupport.rst.txt
Normal file
159
python-3.7.4-docs-html/_sources/c-api/gcsupport.rst.txt
Normal file
@@ -0,0 +1,159 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _supporting-cycle-detection:
|
||||
|
||||
Supporting Cyclic Garbage Collection
|
||||
====================================
|
||||
|
||||
Python's support for detecting and collecting garbage which involves circular
|
||||
references requires support from object types which are "containers" for other
|
||||
objects which may also be containers. Types which do not store references to
|
||||
other objects, or which only store references to atomic types (such as numbers
|
||||
or strings), do not need to provide any explicit support for garbage
|
||||
collection.
|
||||
|
||||
To create a container type, the :c:member:`~PyTypeObject.tp_flags` field of the type object must
|
||||
include the :const:`Py_TPFLAGS_HAVE_GC` and provide an implementation of the
|
||||
:c:member:`~PyTypeObject.tp_traverse` handler. If instances of the type are mutable, a
|
||||
:c:member:`~PyTypeObject.tp_clear` implementation must also be provided.
|
||||
|
||||
|
||||
.. data:: Py_TPFLAGS_HAVE_GC
|
||||
:noindex:
|
||||
|
||||
Objects with a type with this flag set must conform with the rules
|
||||
documented here. For convenience these objects will be referred to as
|
||||
container objects.
|
||||
|
||||
Constructors for container types must conform to two rules:
|
||||
|
||||
#. The memory for the object must be allocated using :c:func:`PyObject_GC_New`
|
||||
or :c:func:`PyObject_GC_NewVar`.
|
||||
|
||||
#. Once all the fields which may contain references to other containers are
|
||||
initialized, it must call :c:func:`PyObject_GC_Track`.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyObject_GC_New(TYPE, PyTypeObject *type)
|
||||
|
||||
Analogous to :c:func:`PyObject_New` but for container objects with the
|
||||
:const:`Py_TPFLAGS_HAVE_GC` flag set.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyObject_GC_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size)
|
||||
|
||||
Analogous to :c:func:`PyObject_NewVar` but for container objects with the
|
||||
:const:`Py_TPFLAGS_HAVE_GC` flag set.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyObject_GC_Resize(TYPE, PyVarObject *op, Py_ssize_t newsize)
|
||||
|
||||
Resize an object allocated by :c:func:`PyObject_NewVar`. Returns the
|
||||
resized object or *NULL* on failure. *op* must not be tracked by the collector yet.
|
||||
|
||||
|
||||
.. c:function:: void PyObject_GC_Track(PyObject *op)
|
||||
|
||||
Adds the object *op* to the set of container objects tracked by the
|
||||
collector. The collector can run at unexpected times so objects must be
|
||||
valid while being tracked. This should be called once all the fields
|
||||
followed by the :c:member:`~PyTypeObject.tp_traverse` handler become valid, usually near the
|
||||
end of the constructor.
|
||||
|
||||
|
||||
.. c:function:: void _PyObject_GC_TRACK(PyObject *op)
|
||||
|
||||
A macro version of :c:func:`PyObject_GC_Track`. It should not be used for
|
||||
extension modules.
|
||||
|
||||
.. deprecated:: 3.6
|
||||
This macro is removed from Python 3.8.
|
||||
|
||||
Similarly, the deallocator for the object must conform to a similar pair of
|
||||
rules:
|
||||
|
||||
#. Before fields which refer to other containers are invalidated,
|
||||
:c:func:`PyObject_GC_UnTrack` must be called.
|
||||
|
||||
#. The object's memory must be deallocated using :c:func:`PyObject_GC_Del`.
|
||||
|
||||
|
||||
.. c:function:: void PyObject_GC_Del(void *op)
|
||||
|
||||
Releases memory allocated to an object using :c:func:`PyObject_GC_New` or
|
||||
:c:func:`PyObject_GC_NewVar`.
|
||||
|
||||
|
||||
.. c:function:: void PyObject_GC_UnTrack(void *op)
|
||||
|
||||
Remove the object *op* from the set of container objects tracked by the
|
||||
collector. Note that :c:func:`PyObject_GC_Track` can be called again on
|
||||
this object to add it back to the set of tracked objects. The deallocator
|
||||
(:c:member:`~PyTypeObject.tp_dealloc` handler) should call this for the object before any of
|
||||
the fields used by the :c:member:`~PyTypeObject.tp_traverse` handler become invalid.
|
||||
|
||||
|
||||
.. c:function:: void _PyObject_GC_UNTRACK(PyObject *op)
|
||||
|
||||
A macro version of :c:func:`PyObject_GC_UnTrack`. It should not be used for
|
||||
extension modules.
|
||||
|
||||
.. deprecated:: 3.6
|
||||
This macro is removed from Python 3.8.
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_traverse` handler accepts a function parameter of this type:
|
||||
|
||||
|
||||
.. c:type:: int (*visitproc)(PyObject *object, void *arg)
|
||||
|
||||
Type of the visitor function passed to the :c:member:`~PyTypeObject.tp_traverse` handler.
|
||||
The function should be called with an object to traverse as *object* and
|
||||
the third parameter to the :c:member:`~PyTypeObject.tp_traverse` handler as *arg*. The
|
||||
Python core uses several visitor functions to implement cyclic garbage
|
||||
detection; it's not expected that users will need to write their own
|
||||
visitor functions.
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_traverse` handler must have the following type:
|
||||
|
||||
|
||||
.. c:type:: int (*traverseproc)(PyObject *self, visitproc visit, void *arg)
|
||||
|
||||
Traversal function for a container object. Implementations must call the
|
||||
*visit* function for each object directly contained by *self*, with the
|
||||
parameters to *visit* being the contained object and the *arg* value passed
|
||||
to the handler. The *visit* function must not be called with a *NULL*
|
||||
object argument. If *visit* returns a non-zero value that value should be
|
||||
returned immediately.
|
||||
|
||||
To simplify writing :c:member:`~PyTypeObject.tp_traverse` handlers, a :c:func:`Py_VISIT` macro is
|
||||
provided. In order to use this macro, the :c:member:`~PyTypeObject.tp_traverse` implementation
|
||||
must name its arguments exactly *visit* and *arg*:
|
||||
|
||||
|
||||
.. c:function:: void Py_VISIT(PyObject *o)
|
||||
|
||||
If *o* is not *NULL*, call the *visit* callback, with arguments *o*
|
||||
and *arg*. If *visit* returns a non-zero value, then return it.
|
||||
Using this macro, :c:member:`~PyTypeObject.tp_traverse` handlers
|
||||
look like::
|
||||
|
||||
static int
|
||||
my_traverse(Noddy *self, visitproc visit, void *arg)
|
||||
{
|
||||
Py_VISIT(self->foo);
|
||||
Py_VISIT(self->bar);
|
||||
return 0;
|
||||
}
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_clear` handler must be of the :c:type:`inquiry` type, or *NULL*
|
||||
if the object is immutable.
|
||||
|
||||
|
||||
.. c:type:: int (*inquiry)(PyObject *self)
|
||||
|
||||
Drop references that may have created reference cycles. Immutable objects
|
||||
do not have to define this method since they can never directly create
|
||||
reference cycles. Note that the object must still be valid after calling
|
||||
this method (don't just call :c:func:`Py_DECREF` on a reference). The
|
||||
collector will call this method if it detects that this object is involved
|
||||
in a reference cycle.
|
||||
44
python-3.7.4-docs-html/_sources/c-api/gen.rst.txt
Normal file
44
python-3.7.4-docs-html/_sources/c-api/gen.rst.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _gen-objects:
|
||||
|
||||
Generator Objects
|
||||
-----------------
|
||||
|
||||
Generator objects are what Python uses to implement generator iterators. They
|
||||
are normally created by iterating over a function that yields values, rather
|
||||
than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`.
|
||||
|
||||
|
||||
.. c:type:: PyGenObject
|
||||
|
||||
The C structure used for generator objects.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyGen_Type
|
||||
|
||||
The type object corresponding to generator objects.
|
||||
|
||||
|
||||
.. c:function:: int PyGen_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is a generator object; *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyGen_CheckExact(PyObject *ob)
|
||||
|
||||
Return true if *ob*'s type is *PyGen_Type*; *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyGen_New(PyFrameObject *frame)
|
||||
|
||||
Create and return a new generator object based on the *frame* object.
|
||||
A reference to *frame* is stolen by this function. The argument must not be
|
||||
*NULL*.
|
||||
|
||||
.. c:function:: PyObject* PyGen_NewWithQualName(PyFrameObject *frame, PyObject *name, PyObject *qualname)
|
||||
|
||||
Create and return a new generator object based on the *frame* object,
|
||||
with ``__name__`` and ``__qualname__`` set to *name* and *qualname*.
|
||||
A reference to *frame* is stolen by this function. The *frame* argument
|
||||
must not be *NULL*.
|
||||
317
python-3.7.4-docs-html/_sources/c-api/import.rst.txt
Normal file
317
python-3.7.4-docs-html/_sources/c-api/import.rst.txt
Normal file
@@ -0,0 +1,317 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _importing:
|
||||
|
||||
Importing Modules
|
||||
=================
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ImportModule(const char *name)
|
||||
|
||||
.. index::
|
||||
single: package variable; __all__
|
||||
single: __all__ (package variable)
|
||||
single: modules (in module sys)
|
||||
|
||||
This is a simplified interface to :c:func:`PyImport_ImportModuleEx` below,
|
||||
leaving the *globals* and *locals* arguments set to *NULL* and *level* set
|
||||
to 0. When the *name*
|
||||
argument contains a dot (when it specifies a submodule of a package), the
|
||||
*fromlist* argument is set to the list ``['*']`` so that the return value is the
|
||||
named module rather than the top-level package containing it as would otherwise
|
||||
be the case. (Unfortunately, this has an additional side effect when *name* in
|
||||
fact specifies a subpackage instead of a submodule: the submodules specified in
|
||||
the package's ``__all__`` variable are loaded.) Return a new reference to the
|
||||
imported module, or *NULL* with an exception set on failure. A failing
|
||||
import of a module doesn't leave the module in :data:`sys.modules`.
|
||||
|
||||
This function always uses absolute imports.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ImportModuleNoBlock(const char *name)
|
||||
|
||||
This function is a deprecated alias of :c:func:`PyImport_ImportModule`.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
This function used to fail immediately when the import lock was held
|
||||
by another thread. In Python 3.3 though, the locking scheme switched
|
||||
to per-module locks for most purposes, so this function's special
|
||||
behaviour isn't needed anymore.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ImportModuleEx(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
|
||||
|
||||
.. index:: builtin: __import__
|
||||
|
||||
Import a module. This is best described by referring to the built-in Python
|
||||
function :func:`__import__`.
|
||||
|
||||
The return value is a new reference to the imported module or top-level
|
||||
package, or *NULL* with an exception set on failure. Like for
|
||||
:func:`__import__`, the return value when a submodule of a package was
|
||||
requested is normally the top-level package, unless a non-empty *fromlist*
|
||||
was given.
|
||||
|
||||
Failing imports remove incomplete module objects, like with
|
||||
:c:func:`PyImport_ImportModule`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
|
||||
|
||||
Import a module. This is best described by referring to the built-in Python
|
||||
function :func:`__import__`, as the standard :func:`__import__` function calls
|
||||
this function directly.
|
||||
|
||||
The return value is a new reference to the imported module or top-level package,
|
||||
or *NULL* with an exception set on failure. Like for :func:`__import__`,
|
||||
the return value when a submodule of a package was requested is normally the
|
||||
top-level package, unless a non-empty *fromlist* was given.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
|
||||
|
||||
Similar to :c:func:`PyImport_ImportModuleLevelObject`, but the name is a
|
||||
UTF-8 encoded string instead of a Unicode object.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
Negative values for *level* are no longer accepted.
|
||||
|
||||
.. c:function:: PyObject* PyImport_Import(PyObject *name)
|
||||
|
||||
This is a higher-level interface that calls the current "import hook
|
||||
function" (with an explicit *level* of 0, meaning absolute import). It
|
||||
invokes the :func:`__import__` function from the ``__builtins__`` of the
|
||||
current globals. This means that the import is done using whatever import
|
||||
hooks are installed in the current environment.
|
||||
|
||||
This function always uses absolute imports.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ReloadModule(PyObject *m)
|
||||
|
||||
Reload a module. Return a new reference to the reloaded module, or *NULL* with
|
||||
an exception set on failure (the module still exists in this case).
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_AddModuleObject(PyObject *name)
|
||||
|
||||
Return the module object corresponding to a module name. The *name* argument
|
||||
may be of the form ``package.module``. First check the modules dictionary if
|
||||
there's one there, and if not, create a new one and insert it in the modules
|
||||
dictionary. Return *NULL* with an exception set on failure.
|
||||
|
||||
.. note::
|
||||
|
||||
This function does not load or import the module; if the module wasn't already
|
||||
loaded, you will get an empty module object. Use :c:func:`PyImport_ImportModule`
|
||||
or one of its variants to import a module. Package structures implied by a
|
||||
dotted name for *name* are not created if not already present.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_AddModule(const char *name)
|
||||
|
||||
Similar to :c:func:`PyImport_AddModuleObject`, but the name is a UTF-8
|
||||
encoded string instead of a Unicode object.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ExecCodeModule(const char *name, PyObject *co)
|
||||
|
||||
.. index:: builtin: compile
|
||||
|
||||
Given a module name (possibly of the form ``package.module``) and a code object
|
||||
read from a Python bytecode file or obtained from the built-in function
|
||||
:func:`compile`, load the module. Return a new reference to the module object,
|
||||
or *NULL* with an exception set if an error occurred. *name*
|
||||
is removed from :attr:`sys.modules` in error cases, even if *name* was already
|
||||
in :attr:`sys.modules` on entry to :c:func:`PyImport_ExecCodeModule`. Leaving
|
||||
incompletely initialized modules in :attr:`sys.modules` is dangerous, as imports of
|
||||
such modules have no way to know that the module object is an unknown (and
|
||||
probably damaged with respect to the module author's intents) state.
|
||||
|
||||
The module's :attr:`__spec__` and :attr:`__loader__` will be set, if
|
||||
not set already, with the appropriate values. The spec's loader will
|
||||
be set to the module's ``__loader__`` (if set) and to an instance of
|
||||
:class:`SourceFileLoader` otherwise.
|
||||
|
||||
The module's :attr:`__file__` attribute will be set to the code object's
|
||||
:c:member:`co_filename`. If applicable, :attr:`__cached__` will also
|
||||
be set.
|
||||
|
||||
This function will reload the module if it was already imported. See
|
||||
:c:func:`PyImport_ReloadModule` for the intended way to reload a module.
|
||||
|
||||
If *name* points to a dotted name of the form ``package.module``, any package
|
||||
structures not already created will still not be created.
|
||||
|
||||
See also :c:func:`PyImport_ExecCodeModuleEx` and
|
||||
:c:func:`PyImport_ExecCodeModuleWithPathnames`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)
|
||||
|
||||
Like :c:func:`PyImport_ExecCodeModule`, but the :attr:`__file__` attribute of
|
||||
the module object is set to *pathname* if it is non-``NULL``.
|
||||
|
||||
See also :c:func:`PyImport_ExecCodeModuleWithPathnames`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)
|
||||
|
||||
Like :c:func:`PyImport_ExecCodeModuleEx`, but the :attr:`__cached__`
|
||||
attribute of the module object is set to *cpathname* if it is
|
||||
non-``NULL``. Of the three functions, this is the preferred one to use.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)
|
||||
|
||||
Like :c:func:`PyImport_ExecCodeModuleObject`, but *name*, *pathname* and
|
||||
*cpathname* are UTF-8 encoded strings. Attempts are also made to figure out
|
||||
what the value for *pathname* should be from *cpathname* if the former is
|
||||
set to ``NULL``.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
.. versionchanged:: 3.3
|
||||
Uses :func:`imp.source_from_cache()` in calculating the source path if
|
||||
only the bytecode path is provided.
|
||||
|
||||
|
||||
.. c:function:: long PyImport_GetMagicNumber()
|
||||
|
||||
Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` file).
|
||||
The magic number should be present in the first four bytes of the bytecode
|
||||
file, in little-endian byte order. Returns ``-1`` on error.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
Return value of ``-1`` upon failure.
|
||||
|
||||
|
||||
.. c:function:: const char * PyImport_GetMagicTag()
|
||||
|
||||
Return the magic tag string for :pep:`3147` format Python bytecode file
|
||||
names. Keep in mind that the value at ``sys.implementation.cache_tag`` is
|
||||
authoritative and should be used instead of this function.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. c:function:: PyObject* PyImport_GetModuleDict()
|
||||
|
||||
Return the dictionary used for the module administration (a.k.a.
|
||||
``sys.modules``). Note that this is a per-interpreter variable.
|
||||
|
||||
.. c:function:: PyObject* PyImport_GetModule(PyObject *name)
|
||||
|
||||
Return the already imported module with the given name. If the
|
||||
module has not been imported yet then returns NULL but does not set
|
||||
an error. Returns NULL and sets an error if the lookup failed.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. c:function:: PyObject* PyImport_GetImporter(PyObject *path)
|
||||
|
||||
Return a finder object for a :data:`sys.path`/:attr:`pkg.__path__` item
|
||||
*path*, possibly by fetching it from the :data:`sys.path_importer_cache`
|
||||
dict. If it wasn't yet cached, traverse :data:`sys.path_hooks` until a hook
|
||||
is found that can handle the path item. Return ``None`` if no hook could;
|
||||
this tells our caller that the :term:`path based finder` could not find a
|
||||
finder for this path item. Cache the result in :data:`sys.path_importer_cache`.
|
||||
Return a new reference to the finder object.
|
||||
|
||||
|
||||
.. c:function:: void _PyImport_Init()
|
||||
|
||||
Initialize the import mechanism. For internal use only.
|
||||
|
||||
|
||||
.. c:function:: void PyImport_Cleanup()
|
||||
|
||||
Empty the module table. For internal use only.
|
||||
|
||||
|
||||
.. c:function:: void _PyImport_Fini()
|
||||
|
||||
Finalize the import mechanism. For internal use only.
|
||||
|
||||
|
||||
.. c:function:: int PyImport_ImportFrozenModuleObject(PyObject *name)
|
||||
|
||||
Load a frozen module named *name*. Return ``1`` for success, ``0`` if the
|
||||
module is not found, and ``-1`` with an exception set if the initialization
|
||||
failed. To access the imported module on a successful load, use
|
||||
:c:func:`PyImport_ImportModule`. (Note the misnomer --- this function would
|
||||
reload the module if it was already imported.)
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
The ``__file__`` attribute is no longer set on the module.
|
||||
|
||||
|
||||
.. c:function:: int PyImport_ImportFrozenModule(const char *name)
|
||||
|
||||
Similar to :c:func:`PyImport_ImportFrozenModuleObject`, but the name is a
|
||||
UTF-8 encoded string instead of a Unicode object.
|
||||
|
||||
|
||||
.. c:type:: struct _frozen
|
||||
|
||||
.. index:: single: freeze utility
|
||||
|
||||
This is the structure type definition for frozen module descriptors, as
|
||||
generated by the :program:`freeze` utility (see :file:`Tools/freeze/` in the
|
||||
Python source distribution). Its definition, found in :file:`Include/import.h`,
|
||||
is::
|
||||
|
||||
struct _frozen {
|
||||
const char *name;
|
||||
const unsigned char *code;
|
||||
int size;
|
||||
};
|
||||
|
||||
|
||||
.. c:var:: const struct _frozen* PyImport_FrozenModules
|
||||
|
||||
This pointer is initialized to point to an array of :c:type:`struct _frozen`
|
||||
records, terminated by one whose members are all *NULL* or zero. When a frozen
|
||||
module is imported, it is searched in this table. Third-party code could play
|
||||
tricks with this to provide a dynamically created collection of frozen modules.
|
||||
|
||||
|
||||
.. c:function:: int PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
|
||||
|
||||
Add a single module to the existing table of built-in modules. This is a
|
||||
convenience wrapper around :c:func:`PyImport_ExtendInittab`, returning ``-1`` if
|
||||
the table could not be extended. The new module can be imported by the name
|
||||
*name*, and uses the function *initfunc* as the initialization function called
|
||||
on the first attempted import. This should be called before
|
||||
:c:func:`Py_Initialize`.
|
||||
|
||||
|
||||
.. c:type:: struct _inittab
|
||||
|
||||
Structure describing a single entry in the list of built-in modules. Each of
|
||||
these structures gives the name and initialization function for a module built
|
||||
into the interpreter. The name is an ASCII encoded string. Programs which
|
||||
embed Python may use an array of these structures in conjunction with
|
||||
:c:func:`PyImport_ExtendInittab` to provide additional built-in modules.
|
||||
The structure is defined in :file:`Include/import.h` as::
|
||||
|
||||
struct _inittab {
|
||||
const char *name; /* ASCII encoded string */
|
||||
PyObject* (*initfunc)(void);
|
||||
};
|
||||
|
||||
|
||||
.. c:function:: int PyImport_ExtendInittab(struct _inittab *newtab)
|
||||
|
||||
Add a collection of modules to the table of built-in modules. The *newtab*
|
||||
array must end with a sentinel entry which contains *NULL* for the :attr:`name`
|
||||
field; failure to provide the sentinel value can result in a memory fault.
|
||||
Returns ``0`` on success or ``-1`` if insufficient memory could be allocated to
|
||||
extend the internal table. In the event of failure, no modules are added to the
|
||||
internal table. This should be called before :c:func:`Py_Initialize`.
|
||||
26
python-3.7.4-docs-html/_sources/c-api/index.rst.txt
Normal file
26
python-3.7.4-docs-html/_sources/c-api/index.rst.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
.. _c-api-index:
|
||||
|
||||
##################################
|
||||
Python/C API Reference Manual
|
||||
##################################
|
||||
|
||||
This manual documents the API used by C and C++ programmers who want to write
|
||||
extension modules or embed Python. It is a companion to :ref:`extending-index`,
|
||||
which describes the general principles of extension writing but does not
|
||||
document the API functions in detail.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
intro.rst
|
||||
stable.rst
|
||||
veryhigh.rst
|
||||
refcounting.rst
|
||||
exceptions.rst
|
||||
utilities.rst
|
||||
abstract.rst
|
||||
concrete.rst
|
||||
init.rst
|
||||
memory.rst
|
||||
objimpl.rst
|
||||
apiabiversion.rst
|
||||
1576
python-3.7.4-docs-html/_sources/c-api/init.rst.txt
Normal file
1576
python-3.7.4-docs-html/_sources/c-api/init.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
725
python-3.7.4-docs-html/_sources/c-api/intro.rst.txt
Normal file
725
python-3.7.4-docs-html/_sources/c-api/intro.rst.txt
Normal file
@@ -0,0 +1,725 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _api-intro:
|
||||
|
||||
************
|
||||
Introduction
|
||||
************
|
||||
|
||||
The Application Programmer's Interface to Python gives C and C++ programmers
|
||||
access to the Python interpreter at a variety of levels. The API is equally
|
||||
usable from C++, but for brevity it is generally referred to as the Python/C
|
||||
API. There are two fundamentally different reasons for using the Python/C API.
|
||||
The first reason is to write *extension modules* for specific purposes; these
|
||||
are C modules that extend the Python interpreter. This is probably the most
|
||||
common use. The second reason is to use Python as a component in a larger
|
||||
application; this technique is generally referred to as :dfn:`embedding` Python
|
||||
in an application.
|
||||
|
||||
Writing an extension module is a relatively well-understood process, where a
|
||||
"cookbook" approach works well. There are several tools that automate the
|
||||
process to some extent. While people have embedded Python in other
|
||||
applications since its early existence, the process of embedding Python is
|
||||
less straightforward than writing an extension.
|
||||
|
||||
Many API functions are useful independent of whether you're embedding or
|
||||
extending Python; moreover, most applications that embed Python will need to
|
||||
provide a custom extension as well, so it's probably a good idea to become
|
||||
familiar with writing an extension before attempting to embed Python in a real
|
||||
application.
|
||||
|
||||
|
||||
Coding standards
|
||||
================
|
||||
|
||||
If you're writing C code for inclusion in CPython, you **must** follow the
|
||||
guidelines and standards defined in :PEP:`7`. These guidelines apply
|
||||
regardless of the version of Python you are contributing to. Following these
|
||||
conventions is not necessary for your own third party extension modules,
|
||||
unless you eventually expect to contribute them to Python.
|
||||
|
||||
|
||||
.. _api-includes:
|
||||
|
||||
Include Files
|
||||
=============
|
||||
|
||||
All function, type and macro definitions needed to use the Python/C API are
|
||||
included in your code by the following line::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
|
||||
This implies inclusion of the following standard headers: ``<stdio.h>``,
|
||||
``<string.h>``, ``<errno.h>``, ``<limits.h>``, ``<assert.h>`` and ``<stdlib.h>``
|
||||
(if available).
|
||||
|
||||
.. note::
|
||||
|
||||
Since Python may define some pre-processor definitions which affect the standard
|
||||
headers on some systems, you *must* include :file:`Python.h` before any standard
|
||||
headers are included.
|
||||
|
||||
It is recommended to always define ``PY_SSIZE_T_CLEAN`` before including
|
||||
``Python.h``. See :ref:`arg-parsing` for a description of this macro.
|
||||
|
||||
All user visible names defined by Python.h (except those defined by the included
|
||||
standard headers) have one of the prefixes ``Py`` or ``_Py``. Names beginning
|
||||
with ``_Py`` are for internal use by the Python implementation and should not be
|
||||
used by extension writers. Structure member names do not have a reserved prefix.
|
||||
|
||||
**Important:** user code should never define names that begin with ``Py`` or
|
||||
``_Py``. This confuses the reader, and jeopardizes the portability of the user
|
||||
code to future Python versions, which may define additional names beginning with
|
||||
one of these prefixes.
|
||||
|
||||
The header files are typically installed with Python. On Unix, these are
|
||||
located in the directories :file:`{prefix}/include/pythonversion/` and
|
||||
:file:`{exec_prefix}/include/pythonversion/`, where :envvar:`prefix` and
|
||||
:envvar:`exec_prefix` are defined by the corresponding parameters to Python's
|
||||
:program:`configure` script and *version* is
|
||||
``'%d.%d' % sys.version_info[:2]``. On Windows, the headers are installed
|
||||
in :file:`{prefix}/include`, where :envvar:`prefix` is the installation
|
||||
directory specified to the installer.
|
||||
|
||||
To include the headers, place both directories (if different) on your compiler's
|
||||
search path for includes. Do *not* place the parent directories on the search
|
||||
path and then use ``#include <pythonX.Y/Python.h>``; this will break on
|
||||
multi-platform builds since the platform independent headers under
|
||||
:envvar:`prefix` include the platform specific headers from
|
||||
:envvar:`exec_prefix`.
|
||||
|
||||
C++ users should note that though the API is defined entirely using C, the
|
||||
header files do properly declare the entry points to be ``extern "C"``, so there
|
||||
is no need to do anything special to use the API from C++.
|
||||
|
||||
|
||||
Useful macros
|
||||
=============
|
||||
|
||||
Several useful macros are defined in the Python header files. Many are
|
||||
defined closer to where they are useful (e.g. :c:macro:`Py_RETURN_NONE`).
|
||||
Others of a more general utility are defined here. This is not necessarily a
|
||||
complete listing.
|
||||
|
||||
.. c:macro:: Py_UNREACHABLE()
|
||||
|
||||
Use this when you have a code path that you do not expect to be reached.
|
||||
For example, in the ``default:`` clause in a ``switch`` statement for which
|
||||
all possible values are covered in ``case`` statements. Use this in places
|
||||
where you might be tempted to put an ``assert(0)`` or ``abort()`` call.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. c:macro:: Py_ABS(x)
|
||||
|
||||
Return the absolute value of ``x``.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:macro:: Py_MIN(x, y)
|
||||
|
||||
Return the minimum value between ``x`` and ``y``.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:macro:: Py_MAX(x, y)
|
||||
|
||||
Return the maximum value between ``x`` and ``y``.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:macro:: Py_STRINGIFY(x)
|
||||
|
||||
Convert ``x`` to a C string. E.g. ``Py_STRINGIFY(123)`` returns
|
||||
``"123"``.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. c:macro:: Py_MEMBER_SIZE(type, member)
|
||||
|
||||
Return the size of a structure (``type``) ``member`` in bytes.
|
||||
|
||||
.. versionadded:: 3.6
|
||||
|
||||
.. c:macro:: Py_CHARMASK(c)
|
||||
|
||||
Argument must be a character or an integer in the range [-128, 127] or [0,
|
||||
255]. This macro returns ``c`` cast to an ``unsigned char``.
|
||||
|
||||
.. c:macro:: Py_GETENV(s)
|
||||
|
||||
Like ``getenv(s)``, but returns *NULL* if :option:`-E` was passed on the
|
||||
command line (i.e. if ``Py_IgnoreEnvironmentFlag`` is set).
|
||||
|
||||
.. c:macro:: Py_UNUSED(arg)
|
||||
|
||||
Use this for unused arguments in a function definition to silence compiler
|
||||
warnings, e.g. ``PyObject* func(PyObject *Py_UNUSED(ignored))``.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
||||
.. _api-objects:
|
||||
|
||||
Objects, Types and Reference Counts
|
||||
===================================
|
||||
|
||||
.. index:: object: type
|
||||
|
||||
Most Python/C API functions have one or more arguments as well as a return value
|
||||
of type :c:type:`PyObject\*`. This type is a pointer to an opaque data type
|
||||
representing an arbitrary Python object. Since all Python object types are
|
||||
treated the same way by the Python language in most situations (e.g.,
|
||||
assignments, scope rules, and argument passing), it is only fitting that they
|
||||
should be represented by a single C type. Almost all Python objects live on the
|
||||
heap: you never declare an automatic or static variable of type
|
||||
:c:type:`PyObject`, only pointer variables of type :c:type:`PyObject\*` can be
|
||||
declared. The sole exception are the type objects; since these must never be
|
||||
deallocated, they are typically static :c:type:`PyTypeObject` objects.
|
||||
|
||||
All Python objects (even Python integers) have a :dfn:`type` and a
|
||||
:dfn:`reference count`. An object's type determines what kind of object it is
|
||||
(e.g., an integer, a list, or a user-defined function; there are many more as
|
||||
explained in :ref:`types`). For each of the well-known types there is a macro
|
||||
to check whether an object is of that type; for instance, ``PyList_Check(a)`` is
|
||||
true if (and only if) the object pointed to by *a* is a Python list.
|
||||
|
||||
|
||||
.. _api-refcounts:
|
||||
|
||||
Reference Counts
|
||||
----------------
|
||||
|
||||
The reference count is important because today's computers have a finite (and
|
||||
often severely limited) memory size; it counts how many different places there
|
||||
are that have a reference to an object. Such a place could be another object,
|
||||
or a global (or static) C variable, or a local variable in some C function.
|
||||
When an object's reference count becomes zero, the object is deallocated. If
|
||||
it contains references to other objects, their reference count is decremented.
|
||||
Those other objects may be deallocated in turn, if this decrement makes their
|
||||
reference count become zero, and so on. (There's an obvious problem with
|
||||
objects that reference each other here; for now, the solution is "don't do
|
||||
that.")
|
||||
|
||||
.. index::
|
||||
single: Py_INCREF()
|
||||
single: Py_DECREF()
|
||||
|
||||
Reference counts are always manipulated explicitly. The normal way is to use
|
||||
the macro :c:func:`Py_INCREF` to increment an object's reference count by one,
|
||||
and :c:func:`Py_DECREF` to decrement it by one. The :c:func:`Py_DECREF` macro
|
||||
is considerably more complex than the incref one, since it must check whether
|
||||
the reference count becomes zero and then cause the object's deallocator to be
|
||||
called. The deallocator is a function pointer contained in the object's type
|
||||
structure. The type-specific deallocator takes care of decrementing the
|
||||
reference counts for other objects contained in the object if this is a compound
|
||||
object type, such as a list, as well as performing any additional finalization
|
||||
that's needed. There's no chance that the reference count can overflow; at
|
||||
least as many bits are used to hold the reference count as there are distinct
|
||||
memory locations in virtual memory (assuming ``sizeof(Py_ssize_t) >= sizeof(void*)``).
|
||||
Thus, the reference count increment is a simple operation.
|
||||
|
||||
It is not necessary to increment an object's reference count for every local
|
||||
variable that contains a pointer to an object. In theory, the object's
|
||||
reference count goes up by one when the variable is made to point to it and it
|
||||
goes down by one when the variable goes out of scope. However, these two
|
||||
cancel each other out, so at the end the reference count hasn't changed. The
|
||||
only real reason to use the reference count is to prevent the object from being
|
||||
deallocated as long as our variable is pointing to it. If we know that there
|
||||
is at least one other reference to the object that lives at least as long as
|
||||
our variable, there is no need to increment the reference count temporarily.
|
||||
An important situation where this arises is in objects that are passed as
|
||||
arguments to C functions in an extension module that are called from Python;
|
||||
the call mechanism guarantees to hold a reference to every argument for the
|
||||
duration of the call.
|
||||
|
||||
However, a common pitfall is to extract an object from a list and hold on to it
|
||||
for a while without incrementing its reference count. Some other operation might
|
||||
conceivably remove the object from the list, decrementing its reference count
|
||||
and possible deallocating it. The real danger is that innocent-looking
|
||||
operations may invoke arbitrary Python code which could do this; there is a code
|
||||
path which allows control to flow back to the user from a :c:func:`Py_DECREF`, so
|
||||
almost any operation is potentially dangerous.
|
||||
|
||||
A safe approach is to always use the generic operations (functions whose name
|
||||
begins with ``PyObject_``, ``PyNumber_``, ``PySequence_`` or ``PyMapping_``).
|
||||
These operations always increment the reference count of the object they return.
|
||||
This leaves the caller with the responsibility to call :c:func:`Py_DECREF` when
|
||||
they are done with the result; this soon becomes second nature.
|
||||
|
||||
|
||||
.. _api-refcountdetails:
|
||||
|
||||
Reference Count Details
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The reference count behavior of functions in the Python/C API is best explained
|
||||
in terms of *ownership of references*. Ownership pertains to references, never
|
||||
to objects (objects are not owned: they are always shared). "Owning a
|
||||
reference" means being responsible for calling Py_DECREF on it when the
|
||||
reference is no longer needed. Ownership can also be transferred, meaning that
|
||||
the code that receives ownership of the reference then becomes responsible for
|
||||
eventually decref'ing it by calling :c:func:`Py_DECREF` or :c:func:`Py_XDECREF`
|
||||
when it's no longer needed---or passing on this responsibility (usually to its
|
||||
caller). When a function passes ownership of a reference on to its caller, the
|
||||
caller is said to receive a *new* reference. When no ownership is transferred,
|
||||
the caller is said to *borrow* the reference. Nothing needs to be done for a
|
||||
borrowed reference.
|
||||
|
||||
Conversely, when a calling function passes in a reference to an object, there
|
||||
are two possibilities: the function *steals* a reference to the object, or it
|
||||
does not. *Stealing a reference* means that when you pass a reference to a
|
||||
function, that function assumes that it now owns that reference, and you are not
|
||||
responsible for it any longer.
|
||||
|
||||
.. index::
|
||||
single: PyList_SetItem()
|
||||
single: PyTuple_SetItem()
|
||||
|
||||
Few functions steal references; the two notable exceptions are
|
||||
:c:func:`PyList_SetItem` and :c:func:`PyTuple_SetItem`, which steal a reference
|
||||
to the item (but not to the tuple or list into which the item is put!). These
|
||||
functions were designed to steal a reference because of a common idiom for
|
||||
populating a tuple or list with newly created objects; for example, the code to
|
||||
create the tuple ``(1, 2, "three")`` could look like this (forgetting about
|
||||
error handling for the moment; a better way to code this is shown below)::
|
||||
|
||||
PyObject *t;
|
||||
|
||||
t = PyTuple_New(3);
|
||||
PyTuple_SetItem(t, 0, PyLong_FromLong(1L));
|
||||
PyTuple_SetItem(t, 1, PyLong_FromLong(2L));
|
||||
PyTuple_SetItem(t, 2, PyUnicode_FromString("three"));
|
||||
|
||||
Here, :c:func:`PyLong_FromLong` returns a new reference which is immediately
|
||||
stolen by :c:func:`PyTuple_SetItem`. When you want to keep using an object
|
||||
although the reference to it will be stolen, use :c:func:`Py_INCREF` to grab
|
||||
another reference before calling the reference-stealing function.
|
||||
|
||||
Incidentally, :c:func:`PyTuple_SetItem` is the *only* way to set tuple items;
|
||||
:c:func:`PySequence_SetItem` and :c:func:`PyObject_SetItem` refuse to do this
|
||||
since tuples are an immutable data type. You should only use
|
||||
:c:func:`PyTuple_SetItem` for tuples that you are creating yourself.
|
||||
|
||||
Equivalent code for populating a list can be written using :c:func:`PyList_New`
|
||||
and :c:func:`PyList_SetItem`.
|
||||
|
||||
However, in practice, you will rarely use these ways of creating and populating
|
||||
a tuple or list. There's a generic function, :c:func:`Py_BuildValue`, that can
|
||||
create most common objects from C values, directed by a :dfn:`format string`.
|
||||
For example, the above two blocks of code could be replaced by the following
|
||||
(which also takes care of the error checking)::
|
||||
|
||||
PyObject *tuple, *list;
|
||||
|
||||
tuple = Py_BuildValue("(iis)", 1, 2, "three");
|
||||
list = Py_BuildValue("[iis]", 1, 2, "three");
|
||||
|
||||
It is much more common to use :c:func:`PyObject_SetItem` and friends with items
|
||||
whose references you are only borrowing, like arguments that were passed in to
|
||||
the function you are writing. In that case, their behaviour regarding reference
|
||||
counts is much saner, since you don't have to increment a reference count so you
|
||||
can give a reference away ("have it be stolen"). For example, this function
|
||||
sets all items of a list (actually, any mutable sequence) to a given item::
|
||||
|
||||
int
|
||||
set_all(PyObject *target, PyObject *item)
|
||||
{
|
||||
Py_ssize_t i, n;
|
||||
|
||||
n = PyObject_Length(target);
|
||||
if (n < 0)
|
||||
return -1;
|
||||
for (i = 0; i < n; i++) {
|
||||
PyObject *index = PyLong_FromSsize_t(i);
|
||||
if (!index)
|
||||
return -1;
|
||||
if (PyObject_SetItem(target, index, item) < 0) {
|
||||
Py_DECREF(index);
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(index);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
.. index:: single: set_all()
|
||||
|
||||
The situation is slightly different for function return values. While passing
|
||||
a reference to most functions does not change your ownership responsibilities
|
||||
for that reference, many functions that return a reference to an object give
|
||||
you ownership of the reference. The reason is simple: in many cases, the
|
||||
returned object is created on the fly, and the reference you get is the only
|
||||
reference to the object. Therefore, the generic functions that return object
|
||||
references, like :c:func:`PyObject_GetItem` and :c:func:`PySequence_GetItem`,
|
||||
always return a new reference (the caller becomes the owner of the reference).
|
||||
|
||||
It is important to realize that whether you own a reference returned by a
|
||||
function depends on which function you call only --- *the plumage* (the type of
|
||||
the object passed as an argument to the function) *doesn't enter into it!*
|
||||
Thus, if you extract an item from a list using :c:func:`PyList_GetItem`, you
|
||||
don't own the reference --- but if you obtain the same item from the same list
|
||||
using :c:func:`PySequence_GetItem` (which happens to take exactly the same
|
||||
arguments), you do own a reference to the returned object.
|
||||
|
||||
.. index::
|
||||
single: PyList_GetItem()
|
||||
single: PySequence_GetItem()
|
||||
|
||||
Here is an example of how you could write a function that computes the sum of
|
||||
the items in a list of integers; once using :c:func:`PyList_GetItem`, and once
|
||||
using :c:func:`PySequence_GetItem`. ::
|
||||
|
||||
long
|
||||
sum_list(PyObject *list)
|
||||
{
|
||||
Py_ssize_t i, n;
|
||||
long total = 0, value;
|
||||
PyObject *item;
|
||||
|
||||
n = PyList_Size(list);
|
||||
if (n < 0)
|
||||
return -1; /* Not a list */
|
||||
for (i = 0; i < n; i++) {
|
||||
item = PyList_GetItem(list, i); /* Can't fail */
|
||||
if (!PyLong_Check(item)) continue; /* Skip non-integers */
|
||||
value = PyLong_AsLong(item);
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
/* Integer too big to fit in a C long, bail out */
|
||||
return -1;
|
||||
total += value;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
.. index:: single: sum_list()
|
||||
|
||||
::
|
||||
|
||||
long
|
||||
sum_sequence(PyObject *sequence)
|
||||
{
|
||||
Py_ssize_t i, n;
|
||||
long total = 0, value;
|
||||
PyObject *item;
|
||||
n = PySequence_Length(sequence);
|
||||
if (n < 0)
|
||||
return -1; /* Has no length */
|
||||
for (i = 0; i < n; i++) {
|
||||
item = PySequence_GetItem(sequence, i);
|
||||
if (item == NULL)
|
||||
return -1; /* Not a sequence, or other failure */
|
||||
if (PyLong_Check(item)) {
|
||||
value = PyLong_AsLong(item);
|
||||
Py_DECREF(item);
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
/* Integer too big to fit in a C long, bail out */
|
||||
return -1;
|
||||
total += value;
|
||||
}
|
||||
else {
|
||||
Py_DECREF(item); /* Discard reference ownership */
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
.. index:: single: sum_sequence()
|
||||
|
||||
|
||||
.. _api-types:
|
||||
|
||||
Types
|
||||
-----
|
||||
|
||||
There are few other data types that play a significant role in the Python/C
|
||||
API; most are simple C types such as :c:type:`int`, :c:type:`long`,
|
||||
:c:type:`double` and :c:type:`char\*`. A few structure types are used to
|
||||
describe static tables used to list the functions exported by a module or the
|
||||
data attributes of a new object type, and another is used to describe the value
|
||||
of a complex number. These will be discussed together with the functions that
|
||||
use them.
|
||||
|
||||
|
||||
.. _api-exceptions:
|
||||
|
||||
Exceptions
|
||||
==========
|
||||
|
||||
The Python programmer only needs to deal with exceptions if specific error
|
||||
handling is required; unhandled exceptions are automatically propagated to the
|
||||
caller, then to the caller's caller, and so on, until they reach the top-level
|
||||
interpreter, where they are reported to the user accompanied by a stack
|
||||
traceback.
|
||||
|
||||
.. index:: single: PyErr_Occurred()
|
||||
|
||||
For C programmers, however, error checking always has to be explicit. All
|
||||
functions in the Python/C API can raise exceptions, unless an explicit claim is
|
||||
made otherwise in a function's documentation. In general, when a function
|
||||
encounters an error, it sets an exception, discards any object references that
|
||||
it owns, and returns an error indicator. If not documented otherwise, this
|
||||
indicator is either *NULL* or ``-1``, depending on the function's return type.
|
||||
A few functions return a Boolean true/false result, with false indicating an
|
||||
error. Very few functions return no explicit error indicator or have an
|
||||
ambiguous return value, and require explicit testing for errors with
|
||||
:c:func:`PyErr_Occurred`. These exceptions are always explicitly documented.
|
||||
|
||||
.. index::
|
||||
single: PyErr_SetString()
|
||||
single: PyErr_Clear()
|
||||
|
||||
Exception state is maintained in per-thread storage (this is equivalent to
|
||||
using global storage in an unthreaded application). A thread can be in one of
|
||||
two states: an exception has occurred, or not. The function
|
||||
:c:func:`PyErr_Occurred` can be used to check for this: it returns a borrowed
|
||||
reference to the exception type object when an exception has occurred, and
|
||||
*NULL* otherwise. There are a number of functions to set the exception state:
|
||||
:c:func:`PyErr_SetString` is the most common (though not the most general)
|
||||
function to set the exception state, and :c:func:`PyErr_Clear` clears the
|
||||
exception state.
|
||||
|
||||
The full exception state consists of three objects (all of which can be
|
||||
*NULL*): the exception type, the corresponding exception value, and the
|
||||
traceback. These have the same meanings as the Python result of
|
||||
``sys.exc_info()``; however, they are not the same: the Python objects represent
|
||||
the last exception being handled by a Python :keyword:`try` ...
|
||||
:keyword:`except` statement, while the C level exception state only exists while
|
||||
an exception is being passed on between C functions until it reaches the Python
|
||||
bytecode interpreter's main loop, which takes care of transferring it to
|
||||
``sys.exc_info()`` and friends.
|
||||
|
||||
.. index:: single: exc_info() (in module sys)
|
||||
|
||||
Note that starting with Python 1.5, the preferred, thread-safe way to access the
|
||||
exception state from Python code is to call the function :func:`sys.exc_info`,
|
||||
which returns the per-thread exception state for Python code. Also, the
|
||||
semantics of both ways to access the exception state have changed so that a
|
||||
function which catches an exception will save and restore its thread's exception
|
||||
state so as to preserve the exception state of its caller. This prevents common
|
||||
bugs in exception handling code caused by an innocent-looking function
|
||||
overwriting the exception being handled; it also reduces the often unwanted
|
||||
lifetime extension for objects that are referenced by the stack frames in the
|
||||
traceback.
|
||||
|
||||
As a general principle, a function that calls another function to perform some
|
||||
task should check whether the called function raised an exception, and if so,
|
||||
pass the exception state on to its caller. It should discard any object
|
||||
references that it owns, and return an error indicator, but it should *not* set
|
||||
another exception --- that would overwrite the exception that was just raised,
|
||||
and lose important information about the exact cause of the error.
|
||||
|
||||
.. index:: single: sum_sequence()
|
||||
|
||||
A simple example of detecting exceptions and passing them on is shown in the
|
||||
:c:func:`sum_sequence` example above. It so happens that this example doesn't
|
||||
need to clean up any owned references when it detects an error. The following
|
||||
example function shows some error cleanup. First, to remind you why you like
|
||||
Python, we show the equivalent Python code::
|
||||
|
||||
def incr_item(dict, key):
|
||||
try:
|
||||
item = dict[key]
|
||||
except KeyError:
|
||||
item = 0
|
||||
dict[key] = item + 1
|
||||
|
||||
.. index:: single: incr_item()
|
||||
|
||||
Here is the corresponding C code, in all its glory::
|
||||
|
||||
int
|
||||
incr_item(PyObject *dict, PyObject *key)
|
||||
{
|
||||
/* Objects all initialized to NULL for Py_XDECREF */
|
||||
PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL;
|
||||
int rv = -1; /* Return value initialized to -1 (failure) */
|
||||
|
||||
item = PyObject_GetItem(dict, key);
|
||||
if (item == NULL) {
|
||||
/* Handle KeyError only: */
|
||||
if (!PyErr_ExceptionMatches(PyExc_KeyError))
|
||||
goto error;
|
||||
|
||||
/* Clear the error and use zero: */
|
||||
PyErr_Clear();
|
||||
item = PyLong_FromLong(0L);
|
||||
if (item == NULL)
|
||||
goto error;
|
||||
}
|
||||
const_one = PyLong_FromLong(1L);
|
||||
if (const_one == NULL)
|
||||
goto error;
|
||||
|
||||
incremented_item = PyNumber_Add(item, const_one);
|
||||
if (incremented_item == NULL)
|
||||
goto error;
|
||||
|
||||
if (PyObject_SetItem(dict, key, incremented_item) < 0)
|
||||
goto error;
|
||||
rv = 0; /* Success */
|
||||
/* Continue with cleanup code */
|
||||
|
||||
error:
|
||||
/* Cleanup code, shared by success and failure path */
|
||||
|
||||
/* Use Py_XDECREF() to ignore NULL references */
|
||||
Py_XDECREF(item);
|
||||
Py_XDECREF(const_one);
|
||||
Py_XDECREF(incremented_item);
|
||||
|
||||
return rv; /* -1 for error, 0 for success */
|
||||
}
|
||||
|
||||
.. index:: single: incr_item()
|
||||
|
||||
.. index::
|
||||
single: PyErr_ExceptionMatches()
|
||||
single: PyErr_Clear()
|
||||
single: Py_XDECREF()
|
||||
|
||||
This example represents an endorsed use of the ``goto`` statement in C!
|
||||
It illustrates the use of :c:func:`PyErr_ExceptionMatches` and
|
||||
:c:func:`PyErr_Clear` to handle specific exceptions, and the use of
|
||||
:c:func:`Py_XDECREF` to dispose of owned references that may be *NULL* (note the
|
||||
``'X'`` in the name; :c:func:`Py_DECREF` would crash when confronted with a
|
||||
*NULL* reference). It is important that the variables used to hold owned
|
||||
references are initialized to *NULL* for this to work; likewise, the proposed
|
||||
return value is initialized to ``-1`` (failure) and only set to success after
|
||||
the final call made is successful.
|
||||
|
||||
|
||||
.. _api-embedding:
|
||||
|
||||
Embedding Python
|
||||
================
|
||||
|
||||
The one important task that only embedders (as opposed to extension writers) of
|
||||
the Python interpreter have to worry about is the initialization, and possibly
|
||||
the finalization, of the Python interpreter. Most functionality of the
|
||||
interpreter can only be used after the interpreter has been initialized.
|
||||
|
||||
.. index::
|
||||
single: Py_Initialize()
|
||||
module: builtins
|
||||
module: __main__
|
||||
module: sys
|
||||
triple: module; search; path
|
||||
single: path (in module sys)
|
||||
|
||||
The basic initialization function is :c:func:`Py_Initialize`. This initializes
|
||||
the table of loaded modules, and creates the fundamental modules
|
||||
:mod:`builtins`, :mod:`__main__`, and :mod:`sys`. It also
|
||||
initializes the module search path (``sys.path``).
|
||||
|
||||
.. index:: single: PySys_SetArgvEx()
|
||||
|
||||
:c:func:`Py_Initialize` does not set the "script argument list" (``sys.argv``).
|
||||
If this variable is needed by Python code that will be executed later, it must
|
||||
be set explicitly with a call to ``PySys_SetArgvEx(argc, argv, updatepath)``
|
||||
after the call to :c:func:`Py_Initialize`.
|
||||
|
||||
On most systems (in particular, on Unix and Windows, although the details are
|
||||
slightly different), :c:func:`Py_Initialize` calculates the module search path
|
||||
based upon its best guess for the location of the standard Python interpreter
|
||||
executable, assuming that the Python library is found in a fixed location
|
||||
relative to the Python interpreter executable. In particular, it looks for a
|
||||
directory named :file:`lib/python{X.Y}` relative to the parent directory
|
||||
where the executable named :file:`python` is found on the shell command search
|
||||
path (the environment variable :envvar:`PATH`).
|
||||
|
||||
For instance, if the Python executable is found in
|
||||
:file:`/usr/local/bin/python`, it will assume that the libraries are in
|
||||
:file:`/usr/local/lib/python{X.Y}`. (In fact, this particular path is also
|
||||
the "fallback" location, used when no executable file named :file:`python` is
|
||||
found along :envvar:`PATH`.) The user can override this behavior by setting the
|
||||
environment variable :envvar:`PYTHONHOME`, or insert additional directories in
|
||||
front of the standard path by setting :envvar:`PYTHONPATH`.
|
||||
|
||||
.. index::
|
||||
single: Py_SetProgramName()
|
||||
single: Py_GetPath()
|
||||
single: Py_GetPrefix()
|
||||
single: Py_GetExecPrefix()
|
||||
single: Py_GetProgramFullPath()
|
||||
|
||||
The embedding application can steer the search by calling
|
||||
``Py_SetProgramName(file)`` *before* calling :c:func:`Py_Initialize`. Note that
|
||||
:envvar:`PYTHONHOME` still overrides this and :envvar:`PYTHONPATH` is still
|
||||
inserted in front of the standard path. An application that requires total
|
||||
control has to provide its own implementation of :c:func:`Py_GetPath`,
|
||||
:c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, and
|
||||
:c:func:`Py_GetProgramFullPath` (all defined in :file:`Modules/getpath.c`).
|
||||
|
||||
.. index:: single: Py_IsInitialized()
|
||||
|
||||
Sometimes, it is desirable to "uninitialize" Python. For instance, the
|
||||
application may want to start over (make another call to
|
||||
:c:func:`Py_Initialize`) or the application is simply done with its use of
|
||||
Python and wants to free memory allocated by Python. This can be accomplished
|
||||
by calling :c:func:`Py_FinalizeEx`. The function :c:func:`Py_IsInitialized` returns
|
||||
true if Python is currently in the initialized state. More information about
|
||||
these functions is given in a later chapter. Notice that :c:func:`Py_FinalizeEx`
|
||||
does *not* free all memory allocated by the Python interpreter, e.g. memory
|
||||
allocated by extension modules currently cannot be released.
|
||||
|
||||
|
||||
.. _api-debugging:
|
||||
|
||||
Debugging Builds
|
||||
================
|
||||
|
||||
Python can be built with several macros to enable extra checks of the
|
||||
interpreter and extension modules. These checks tend to add a large amount of
|
||||
overhead to the runtime so they are not enabled by default.
|
||||
|
||||
A full list of the various types of debugging builds is in the file
|
||||
:file:`Misc/SpecialBuilds.txt` in the Python source distribution. Builds are
|
||||
available that support tracing of reference counts, debugging the memory
|
||||
allocator, or low-level profiling of the main interpreter loop. Only the most
|
||||
frequently-used builds will be described in the remainder of this section.
|
||||
|
||||
Compiling the interpreter with the :c:macro:`Py_DEBUG` macro defined produces
|
||||
what is generally meant by "a debug build" of Python. :c:macro:`Py_DEBUG` is
|
||||
enabled in the Unix build by adding ``--with-pydebug`` to the
|
||||
:file:`./configure` command. It is also implied by the presence of the
|
||||
not-Python-specific :c:macro:`_DEBUG` macro. When :c:macro:`Py_DEBUG` is enabled
|
||||
in the Unix build, compiler optimization is disabled.
|
||||
|
||||
In addition to the reference count debugging described below, the following
|
||||
extra checks are performed:
|
||||
|
||||
* Extra checks are added to the object allocator.
|
||||
|
||||
* Extra checks are added to the parser and compiler.
|
||||
|
||||
* Downcasts from wide types to narrow types are checked for loss of information.
|
||||
|
||||
* A number of assertions are added to the dictionary and set implementations.
|
||||
In addition, the set object acquires a :meth:`test_c_api` method.
|
||||
|
||||
* Sanity checks of the input arguments are added to frame creation.
|
||||
|
||||
* The storage for ints is initialized with a known invalid pattern to catch
|
||||
reference to uninitialized digits.
|
||||
|
||||
* Low-level tracing and extra exception checking are added to the runtime
|
||||
virtual machine.
|
||||
|
||||
* Extra checks are added to the memory arena implementation.
|
||||
|
||||
* Extra debugging is added to the thread module.
|
||||
|
||||
There may be additional checks not mentioned here.
|
||||
|
||||
Defining :c:macro:`Py_TRACE_REFS` enables reference tracing. When defined, a
|
||||
circular doubly linked list of active objects is maintained by adding two extra
|
||||
fields to every :c:type:`PyObject`. Total allocations are tracked as well. Upon
|
||||
exit, all existing references are printed. (In interactive mode this happens
|
||||
after every statement run by the interpreter.) Implied by :c:macro:`Py_DEBUG`.
|
||||
|
||||
Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution
|
||||
for more detailed information.
|
||||
|
||||
46
python-3.7.4-docs-html/_sources/c-api/iter.rst.txt
Normal file
46
python-3.7.4-docs-html/_sources/c-api/iter.rst.txt
Normal file
@@ -0,0 +1,46 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _iterator:
|
||||
|
||||
Iterator Protocol
|
||||
=================
|
||||
|
||||
There are two functions specifically for working with iterators.
|
||||
|
||||
.. c:function:: int PyIter_Check(PyObject *o)
|
||||
|
||||
Return true if the object *o* supports the iterator protocol.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyIter_Next(PyObject *o)
|
||||
|
||||
Return the next value from the iteration *o*. The object must be an iterator
|
||||
(it is up to the caller to check this). If there are no remaining values,
|
||||
returns *NULL* with no exception set. If an error occurs while retrieving
|
||||
the item, returns *NULL* and passes along the exception.
|
||||
|
||||
To write a loop which iterates over an iterator, the C code should look
|
||||
something like this::
|
||||
|
||||
PyObject *iterator = PyObject_GetIter(obj);
|
||||
PyObject *item;
|
||||
|
||||
if (iterator == NULL) {
|
||||
/* propagate error */
|
||||
}
|
||||
|
||||
while (item = PyIter_Next(iterator)) {
|
||||
/* do something with item */
|
||||
...
|
||||
/* release reference when done */
|
||||
Py_DECREF(item);
|
||||
}
|
||||
|
||||
Py_DECREF(iterator);
|
||||
|
||||
if (PyErr_Occurred()) {
|
||||
/* propagate error */
|
||||
}
|
||||
else {
|
||||
/* continue doing useful work */
|
||||
}
|
||||
50
python-3.7.4-docs-html/_sources/c-api/iterator.rst.txt
Normal file
50
python-3.7.4-docs-html/_sources/c-api/iterator.rst.txt
Normal file
@@ -0,0 +1,50 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _iterator-objects:
|
||||
|
||||
Iterator Objects
|
||||
----------------
|
||||
|
||||
Python provides two general-purpose iterator objects. The first, a sequence
|
||||
iterator, works with an arbitrary sequence supporting the :meth:`__getitem__`
|
||||
method. The second works with a callable object and a sentinel value, calling
|
||||
the callable for each item in the sequence, and ending the iteration when the
|
||||
sentinel value is returned.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PySeqIter_Type
|
||||
|
||||
Type object for iterator objects returned by :c:func:`PySeqIter_New` and the
|
||||
one-argument form of the :func:`iter` built-in function for built-in sequence
|
||||
types.
|
||||
|
||||
|
||||
.. c:function:: int PySeqIter_Check(op)
|
||||
|
||||
Return true if the type of *op* is :c:data:`PySeqIter_Type`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySeqIter_New(PyObject *seq)
|
||||
|
||||
Return an iterator that works with a general sequence object, *seq*. The
|
||||
iteration ends when the sequence raises :exc:`IndexError` for the subscripting
|
||||
operation.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyCallIter_Type
|
||||
|
||||
Type object for iterator objects returned by :c:func:`PyCallIter_New` and the
|
||||
two-argument form of the :func:`iter` built-in function.
|
||||
|
||||
|
||||
.. c:function:: int PyCallIter_Check(op)
|
||||
|
||||
Return true if the type of *op* is :c:data:`PyCallIter_Type`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyCallIter_New(PyObject *callable, PyObject *sentinel)
|
||||
|
||||
Return a new iterator. The first parameter, *callable*, can be any Python
|
||||
callable object that can be called with no parameters; each call to it should
|
||||
return the next item in the iteration. When *callable* returns a value equal to
|
||||
*sentinel*, the iteration will be terminated.
|
||||
151
python-3.7.4-docs-html/_sources/c-api/list.rst.txt
Normal file
151
python-3.7.4-docs-html/_sources/c-api/list.rst.txt
Normal file
@@ -0,0 +1,151 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _listobjects:
|
||||
|
||||
List Objects
|
||||
------------
|
||||
|
||||
.. index:: object: list
|
||||
|
||||
|
||||
.. c:type:: PyListObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python list object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyList_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python list type.
|
||||
This is the same object as :class:`list` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyList_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a list object or an instance of a subtype of the list
|
||||
type.
|
||||
|
||||
|
||||
.. c:function:: int PyList_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a list object, but not an instance of a subtype of
|
||||
the list type.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyList_New(Py_ssize_t len)
|
||||
|
||||
Return a new list of length *len* on success, or *NULL* on failure.
|
||||
|
||||
.. note::
|
||||
|
||||
If *len* is greater than zero, the returned list object's items are
|
||||
set to ``NULL``. Thus you cannot use abstract API functions such as
|
||||
:c:func:`PySequence_SetItem` or expose the object to Python code before
|
||||
setting all items to a real object with :c:func:`PyList_SetItem`.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyList_Size(PyObject *list)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Return the length of the list object in *list*; this is equivalent to
|
||||
``len(list)`` on a list object.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyList_GET_SIZE(PyObject *list)
|
||||
|
||||
Macro form of :c:func:`PyList_Size` without error checking.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyList_GetItem(PyObject *list, Py_ssize_t index)
|
||||
|
||||
Return the object at position *index* in the list pointed to by *list*. The
|
||||
position must be non-negative; indexing from the end of the list is not
|
||||
supported. If *index* is out of bounds (<0 or >=len(list)),
|
||||
return *NULL* and set an :exc:`IndexError` exception.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyList_GET_ITEM(PyObject *list, Py_ssize_t i)
|
||||
|
||||
Macro form of :c:func:`PyList_GetItem` without error checking.
|
||||
|
||||
|
||||
.. c:function:: int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item)
|
||||
|
||||
Set the item at index *index* in list to *item*. Return ``0`` on success
|
||||
or ``-1`` on failure.
|
||||
|
||||
.. note::
|
||||
|
||||
This function "steals" a reference to *item* and discards a reference to
|
||||
an item already in the list at the affected position.
|
||||
|
||||
|
||||
.. c:function:: void PyList_SET_ITEM(PyObject *list, Py_ssize_t i, PyObject *o)
|
||||
|
||||
Macro form of :c:func:`PyList_SetItem` without error checking. This is
|
||||
normally only used to fill in new lists where there is no previous content.
|
||||
|
||||
.. note::
|
||||
|
||||
This macro "steals" a reference to *item*, and, unlike
|
||||
:c:func:`PyList_SetItem`, does *not* discard a reference to any item that
|
||||
is being replaced; any reference in *list* at position *i* will be
|
||||
leaked.
|
||||
|
||||
|
||||
.. c:function:: int PyList_Insert(PyObject *list, Py_ssize_t index, PyObject *item)
|
||||
|
||||
Insert the item *item* into list *list* in front of index *index*. Return
|
||||
``0`` if successful; return ``-1`` and set an exception if unsuccessful.
|
||||
Analogous to ``list.insert(index, item)``.
|
||||
|
||||
|
||||
.. c:function:: int PyList_Append(PyObject *list, PyObject *item)
|
||||
|
||||
Append the object *item* at the end of list *list*. Return ``0`` if
|
||||
successful; return ``-1`` and set an exception if unsuccessful. Analogous
|
||||
to ``list.append(item)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyList_GetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high)
|
||||
|
||||
Return a list of the objects in *list* containing the objects *between* *low*
|
||||
and *high*. Return *NULL* and set an exception if unsuccessful. Analogous
|
||||
to ``list[low:high]``. Negative indices, as when slicing from Python, are not
|
||||
supported.
|
||||
|
||||
|
||||
.. c:function:: int PyList_SetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high, PyObject *itemlist)
|
||||
|
||||
Set the slice of *list* between *low* and *high* to the contents of
|
||||
*itemlist*. Analogous to ``list[low:high] = itemlist``. The *itemlist* may
|
||||
be *NULL*, indicating the assignment of an empty list (slice deletion).
|
||||
Return ``0`` on success, ``-1`` on failure. Negative indices, as when
|
||||
slicing from Python, are not supported.
|
||||
|
||||
|
||||
.. c:function:: int PyList_Sort(PyObject *list)
|
||||
|
||||
Sort the items of *list* in place. Return ``0`` on success, ``-1`` on
|
||||
failure. This is equivalent to ``list.sort()``.
|
||||
|
||||
|
||||
.. c:function:: int PyList_Reverse(PyObject *list)
|
||||
|
||||
Reverse the items of *list* in place. Return ``0`` on success, ``-1`` on
|
||||
failure. This is the equivalent of ``list.reverse()``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyList_AsTuple(PyObject *list)
|
||||
|
||||
.. index:: builtin: tuple
|
||||
|
||||
Return a new tuple object containing the contents of *list*; equivalent to
|
||||
``tuple(list)``.
|
||||
|
||||
|
||||
.. c:function:: int PyList_ClearFreeList()
|
||||
|
||||
Clear the free list. Return the total number of freed items.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
297
python-3.7.4-docs-html/_sources/c-api/long.rst.txt
Normal file
297
python-3.7.4-docs-html/_sources/c-api/long.rst.txt
Normal file
@@ -0,0 +1,297 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _longobjects:
|
||||
|
||||
Integer Objects
|
||||
---------------
|
||||
|
||||
.. index:: object: long integer
|
||||
object: integer
|
||||
|
||||
All integers are implemented as "long" integer objects of arbitrary size.
|
||||
|
||||
On error, most ``PyLong_As*`` APIs return ``(return type)-1`` which cannot be
|
||||
distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
.. c:type:: PyLongObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python integer object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyLong_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python integer type.
|
||||
This is the same object as :class:`int` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyLong_Check(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyLongObject` or a subtype of
|
||||
:c:type:`PyLongObject`.
|
||||
|
||||
|
||||
.. c:function:: int PyLong_CheckExact(PyObject *p)
|
||||
|
||||
Return true if its argument is a :c:type:`PyLongObject`, but not a subtype of
|
||||
:c:type:`PyLongObject`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromLong(long v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from *v*, or *NULL* on failure.
|
||||
|
||||
The current implementation keeps an array of integer objects for all integers
|
||||
between ``-5`` and ``256``, when you create an int in that range you actually
|
||||
just get back a reference to the existing object. So it should be possible to
|
||||
change the value of ``1``. I suspect the behaviour of Python in this case is
|
||||
undefined. :-)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromUnsignedLong(unsigned long v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long`, or
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromSsize_t(Py_ssize_t v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from a C :c:type:`Py_ssize_t`, or
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromSize_t(size_t v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from a C :c:type:`size_t`, or
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromLongLong(long long v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from a C :c:type:`long long`, or *NULL*
|
||||
on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromUnsignedLongLong(unsigned long long v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long long`,
|
||||
or *NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromDouble(double v)
|
||||
|
||||
Return a new :c:type:`PyLongObject` object from the integer part of *v*, or
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromString(const char *str, char **pend, int base)
|
||||
|
||||
Return a new :c:type:`PyLongObject` based on the string value in *str*, which
|
||||
is interpreted according to the radix in *base*. If *pend* is non-*NULL*,
|
||||
*\*pend* will point to the first character in *str* which follows the
|
||||
representation of the number. If *base* is ``0``, *str* is interpreted using
|
||||
the :ref:`integers` definition; in this case, leading zeros in a
|
||||
non-zero decimal number raises a :exc:`ValueError`. If *base* is not ``0``,
|
||||
it must be between ``2`` and ``36``, inclusive. Leading spaces and single
|
||||
underscores after a base specifier and between digits are ignored. If there
|
||||
are no digits, :exc:`ValueError` will be raised.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
|
||||
|
||||
Convert a sequence of Unicode digits to a Python integer value. The Unicode
|
||||
string is first encoded to a byte string using :c:func:`PyUnicode_EncodeDecimal`
|
||||
and then converted using :c:func:`PyLong_FromString`.
|
||||
|
||||
.. deprecated-removed:: 3.3 4.0
|
||||
Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
|
||||
:c:func:`PyLong_FromUnicodeObject`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromUnicodeObject(PyObject *u, int base)
|
||||
|
||||
Convert a sequence of Unicode digits in the string *u* to a Python integer
|
||||
value. The Unicode string is first encoded to a byte string using
|
||||
:c:func:`PyUnicode_EncodeDecimal` and then converted using
|
||||
:c:func:`PyLong_FromString`.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyLong_FromVoidPtr(void *p)
|
||||
|
||||
Create a Python integer from the pointer *p*. The pointer value can be
|
||||
retrieved from the resulting value using :c:func:`PyLong_AsVoidPtr`.
|
||||
|
||||
|
||||
.. XXX alias PyLong_AS_LONG (for now)
|
||||
.. c:function:: long PyLong_AsLong(PyObject *obj)
|
||||
|
||||
.. index::
|
||||
single: LONG_MAX
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`long` representation of *obj*. If *obj* is not an
|
||||
instance of :c:type:`PyLongObject`, first call its :meth:`__int__` method
|
||||
(if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *obj* is out of range for a
|
||||
:c:type:`long`.
|
||||
|
||||
Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow)
|
||||
|
||||
Return a C :c:type:`long` representation of *obj*. If *obj* is not an
|
||||
instance of :c:type:`PyLongObject`, first call its :meth:`__int__` method
|
||||
(if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
If the value of *obj* is greater than :const:`LONG_MAX` or less than
|
||||
:const:`LONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, and
|
||||
return ``-1``; otherwise, set *\*overflow* to ``0``. If any other exception
|
||||
occurs set *\*overflow* to ``0`` and return ``-1`` as usual.
|
||||
|
||||
Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: long long PyLong_AsLongLong(PyObject *obj)
|
||||
|
||||
.. index::
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`long long` representation of *obj*. If *obj* is not an
|
||||
instance of :c:type:`PyLongObject`, first call its :meth:`__int__` method
|
||||
(if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *obj* is out of range for a
|
||||
:c:type:`long`.
|
||||
|
||||
Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: long long PyLong_AsLongLongAndOverflow(PyObject *obj, int *overflow)
|
||||
|
||||
Return a C :c:type:`long long` representation of *obj*. If *obj* is not an
|
||||
instance of :c:type:`PyLongObject`, first call its :meth:`__int__` method
|
||||
(if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
If the value of *obj* is greater than :const:`PY_LLONG_MAX` or less than
|
||||
:const:`PY_LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively,
|
||||
and return ``-1``; otherwise, set *\*overflow* to ``0``. If any other
|
||||
exception occurs set *\*overflow* to ``0`` and return ``-1`` as usual.
|
||||
|
||||
Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyLong_AsSsize_t(PyObject *pylong)
|
||||
|
||||
.. index::
|
||||
single: PY_SSIZE_T_MAX
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`Py_ssize_t` representation of *pylong*. *pylong* must
|
||||
be an instance of :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
|
||||
:c:type:`Py_ssize_t`.
|
||||
|
||||
Returns ``-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: unsigned long PyLong_AsUnsignedLong(PyObject *pylong)
|
||||
|
||||
.. index::
|
||||
single: ULONG_MAX
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`unsigned long` representation of *pylong*. *pylong*
|
||||
must be an instance of :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
|
||||
:c:type:`unsigned long`.
|
||||
|
||||
Returns ``(unsigned long)-1`` on error.
|
||||
Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: size_t PyLong_AsSize_t(PyObject *pylong)
|
||||
|
||||
.. index::
|
||||
single: SIZE_MAX
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`size_t` representation of *pylong*. *pylong* must be
|
||||
an instance of :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
|
||||
:c:type:`size_t`.
|
||||
|
||||
Returns ``(size_t)-1`` on error.
|
||||
Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: unsigned long long PyLong_AsUnsignedLongLong(PyObject *pylong)
|
||||
|
||||
.. index::
|
||||
single: OverflowError (built-in exception)
|
||||
|
||||
Return a C :c:type:`unsigned long long` representation of *pylong*. *pylong*
|
||||
must be an instance of :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *pylong* is out of range for an
|
||||
:c:type:`unsigned long long`.
|
||||
|
||||
Returns ``(unsigned long long)-1`` on error.
|
||||
Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
A negative *pylong* now raises :exc:`OverflowError`, not :exc:`TypeError`.
|
||||
|
||||
|
||||
.. c:function:: unsigned long PyLong_AsUnsignedLongMask(PyObject *obj)
|
||||
|
||||
Return a C :c:type:`unsigned long` representation of *obj*. If *obj*
|
||||
is not an instance of :c:type:`PyLongObject`, first call its :meth:`__int__`
|
||||
method (if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
If the value of *obj* is out of range for an :c:type:`unsigned long`,
|
||||
return the reduction of that value modulo ``ULONG_MAX + 1``.
|
||||
|
||||
Returns ``(unsigned long)-1`` on error. Use :c:func:`PyErr_Occurred` to
|
||||
disambiguate.
|
||||
|
||||
|
||||
.. c:function:: unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj)
|
||||
|
||||
Return a C :c:type:`unsigned long long` representation of *obj*. If *obj*
|
||||
is not an instance of :c:type:`PyLongObject`, first call its :meth:`__int__`
|
||||
method (if present) to convert it to a :c:type:`PyLongObject`.
|
||||
|
||||
If the value of *obj* is out of range for an :c:type:`unsigned long long`,
|
||||
return the reduction of that value modulo ``PY_ULLONG_MAX + 1``.
|
||||
|
||||
Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred`
|
||||
to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: double PyLong_AsDouble(PyObject *pylong)
|
||||
|
||||
Return a C :c:type:`double` representation of *pylong*. *pylong* must be
|
||||
an instance of :c:type:`PyLongObject`.
|
||||
|
||||
Raise :exc:`OverflowError` if the value of *pylong* is out of range for a
|
||||
:c:type:`double`.
|
||||
|
||||
Returns ``-1.0`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
|
||||
|
||||
.. c:function:: void* PyLong_AsVoidPtr(PyObject *pylong)
|
||||
|
||||
Convert a Python integer *pylong* to a C :c:type:`void` pointer.
|
||||
If *pylong* cannot be converted, an :exc:`OverflowError` will be raised. This
|
||||
is only assured to produce a usable :c:type:`void` pointer for values created
|
||||
with :c:func:`PyLong_FromVoidPtr`.
|
||||
|
||||
Returns *NULL* on error. Use :c:func:`PyErr_Occurred` to disambiguate.
|
||||
103
python-3.7.4-docs-html/_sources/c-api/mapping.rst.txt
Normal file
103
python-3.7.4-docs-html/_sources/c-api/mapping.rst.txt
Normal file
@@ -0,0 +1,103 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _mapping:
|
||||
|
||||
Mapping Protocol
|
||||
================
|
||||
|
||||
See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
|
||||
:c:func:`PyObject_DelItem`.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_Check(PyObject *o)
|
||||
|
||||
Return ``1`` if the object provides mapping protocol or supports slicing,
|
||||
and ``0`` otherwise. Note that it returns ``1`` for Python classes with
|
||||
a :meth:`__getitem__` method since in general case it is impossible to
|
||||
determine what the type of keys it supports. This function always
|
||||
succeeds.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyMapping_Size(PyObject *o)
|
||||
Py_ssize_t PyMapping_Length(PyObject *o)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Returns the number of keys in object *o* on success, and ``-1`` on failure.
|
||||
This is equivalent to the Python expression ``len(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMapping_GetItemString(PyObject *o, const char *key)
|
||||
|
||||
Return element of *o* corresponding to the string *key* or *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``o[key]``.
|
||||
See also :c:func:`PyObject_GetItem`.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_SetItemString(PyObject *o, const char *key, PyObject *v)
|
||||
|
||||
Map the string *key* to the value *v* in object *o*. Returns ``-1`` on
|
||||
failure. This is the equivalent of the Python statement ``o[key] = v``.
|
||||
See also :c:func:`PyObject_SetItem`.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_DelItem(PyObject *o, PyObject *key)
|
||||
|
||||
Remove the mapping for the object *key* from the object *o*. Return ``-1``
|
||||
on failure. This is equivalent to the Python statement ``del o[key]``.
|
||||
This is an alias of :c:func:`PyObject_DelItem`.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_DelItemString(PyObject *o, const char *key)
|
||||
|
||||
Remove the mapping for the string *key* from the object *o*. Return ``-1``
|
||||
on failure. This is equivalent to the Python statement ``del o[key]``.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_HasKey(PyObject *o, PyObject *key)
|
||||
|
||||
Return ``1`` if the mapping object has the key *key* and ``0`` otherwise.
|
||||
This is equivalent to the Python expression ``key in o``.
|
||||
This function always succeeds.
|
||||
|
||||
Note that exceptions which occur while calling the :meth:`__getitem__`
|
||||
method will get suppressed.
|
||||
To get error reporting use :c:func:`PyObject_GetItem()` instead.
|
||||
|
||||
|
||||
.. c:function:: int PyMapping_HasKeyString(PyObject *o, const char *key)
|
||||
|
||||
Return ``1`` if the mapping object has the key *key* and ``0`` otherwise.
|
||||
This is equivalent to the Python expression ``key in o``.
|
||||
This function always succeeds.
|
||||
|
||||
Note that exceptions which occur while calling the :meth:`__getitem__`
|
||||
method and creating a temporary string object will get suppressed.
|
||||
To get error reporting use :c:func:`PyMapping_GetItemString()` instead.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMapping_Keys(PyObject *o)
|
||||
|
||||
On success, return a list of the keys in object *o*. On failure, return
|
||||
*NULL*.
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
Previously, the function returned a list or a tuple.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMapping_Values(PyObject *o)
|
||||
|
||||
On success, return a list of the values in object *o*. On failure, return
|
||||
*NULL*.
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
Previously, the function returned a list or a tuple.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMapping_Items(PyObject *o)
|
||||
|
||||
On success, return a list of the items in object *o*, where each item is a
|
||||
tuple containing a key-value pair. On failure, return *NULL*.
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
Previously, the function returned a list or a tuple.
|
||||
94
python-3.7.4-docs-html/_sources/c-api/marshal.rst.txt
Normal file
94
python-3.7.4-docs-html/_sources/c-api/marshal.rst.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _marshalling-utils:
|
||||
|
||||
Data marshalling support
|
||||
========================
|
||||
|
||||
These routines allow C code to work with serialized objects using the same
|
||||
data format as the :mod:`marshal` module. There are functions to write data
|
||||
into the serialization format, and additional functions that can be used to
|
||||
read the data back. Files used to store marshalled data must be opened in
|
||||
binary mode.
|
||||
|
||||
Numeric values are stored with the least significant byte first.
|
||||
|
||||
The module supports two versions of the data format: version 0 is the
|
||||
historical version, version 1 shares interned strings in the file, and upon
|
||||
unmarshalling. Version 2 uses a binary format for floating point numbers.
|
||||
*Py_MARSHAL_VERSION* indicates the current file format (currently 2).
|
||||
|
||||
|
||||
.. c:function:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version)
|
||||
|
||||
Marshal a :c:type:`long` integer, *value*, to *file*. This will only write
|
||||
the least-significant 32 bits of *value*; regardless of the size of the
|
||||
native :c:type:`long` type. *version* indicates the file format.
|
||||
|
||||
|
||||
.. c:function:: void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)
|
||||
|
||||
Marshal a Python object, *value*, to *file*.
|
||||
*version* indicates the file format.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version)
|
||||
|
||||
Return a bytes object containing the marshalled representation of *value*.
|
||||
*version* indicates the file format.
|
||||
|
||||
|
||||
The following functions allow marshalled values to be read back in.
|
||||
|
||||
|
||||
.. c:function:: long PyMarshal_ReadLongFromFile(FILE *file)
|
||||
|
||||
Return a C :c:type:`long` from the data stream in a :c:type:`FILE\*` opened
|
||||
for reading. Only a 32-bit value can be read in using this function,
|
||||
regardless of the native size of :c:type:`long`.
|
||||
|
||||
On error, sets the appropriate exception (:exc:`EOFError`) and returns
|
||||
``-1``.
|
||||
|
||||
|
||||
.. c:function:: int PyMarshal_ReadShortFromFile(FILE *file)
|
||||
|
||||
Return a C :c:type:`short` from the data stream in a :c:type:`FILE\*` opened
|
||||
for reading. Only a 16-bit value can be read in using this function,
|
||||
regardless of the native size of :c:type:`short`.
|
||||
|
||||
On error, sets the appropriate exception (:exc:`EOFError`) and returns
|
||||
``-1``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file)
|
||||
|
||||
Return a Python object from the data stream in a :c:type:`FILE\*` opened for
|
||||
reading.
|
||||
|
||||
On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
|
||||
or :exc:`TypeError`) and returns *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)
|
||||
|
||||
Return a Python object from the data stream in a :c:type:`FILE\*` opened for
|
||||
reading. Unlike :c:func:`PyMarshal_ReadObjectFromFile`, this function
|
||||
assumes that no further objects will be read from the file, allowing it to
|
||||
aggressively load file data into memory so that the de-serialization can
|
||||
operate from data in memory rather than reading a byte at a time from the
|
||||
file. Only use these variant if you are certain that you won't be reading
|
||||
anything else from the file.
|
||||
|
||||
On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
|
||||
or :exc:`TypeError`) and returns *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *data, Py_ssize_t len)
|
||||
|
||||
Return a Python object from the data stream in a byte buffer
|
||||
containing *len* bytes pointed to by *data*.
|
||||
|
||||
On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
|
||||
or :exc:`TypeError`) and returns *NULL*.
|
||||
|
||||
604
python-3.7.4-docs-html/_sources/c-api/memory.rst.txt
Normal file
604
python-3.7.4-docs-html/_sources/c-api/memory.rst.txt
Normal file
@@ -0,0 +1,604 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _memory:
|
||||
|
||||
*****************
|
||||
Memory Management
|
||||
*****************
|
||||
|
||||
.. sectionauthor:: Vladimir Marangozov <Vladimir.Marangozov@inrialpes.fr>
|
||||
|
||||
|
||||
|
||||
.. _memoryoverview:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Memory management in Python involves a private heap containing all Python
|
||||
objects and data structures. The management of this private heap is ensured
|
||||
internally by the *Python memory manager*. The Python memory manager has
|
||||
different components which deal with various dynamic storage management aspects,
|
||||
like sharing, segmentation, preallocation or caching.
|
||||
|
||||
At the lowest level, a raw memory allocator ensures that there is enough room in
|
||||
the private heap for storing all Python-related data by interacting with the
|
||||
memory manager of the operating system. On top of the raw memory allocator,
|
||||
several object-specific allocators operate on the same heap and implement
|
||||
distinct memory management policies adapted to the peculiarities of every object
|
||||
type. For example, integer objects are managed differently within the heap than
|
||||
strings, tuples or dictionaries because integers imply different storage
|
||||
requirements and speed/space tradeoffs. The Python memory manager thus delegates
|
||||
some of the work to the object-specific allocators, but ensures that the latter
|
||||
operate within the bounds of the private heap.
|
||||
|
||||
It is important to understand that the management of the Python heap is
|
||||
performed by the interpreter itself and that the user has no control over it,
|
||||
even if they regularly manipulate object pointers to memory blocks inside that
|
||||
heap. The allocation of heap space for Python objects and other internal
|
||||
buffers is performed on demand by the Python memory manager through the Python/C
|
||||
API functions listed in this document.
|
||||
|
||||
.. index::
|
||||
single: malloc()
|
||||
single: calloc()
|
||||
single: realloc()
|
||||
single: free()
|
||||
|
||||
To avoid memory corruption, extension writers should never try to operate on
|
||||
Python objects with the functions exported by the C library: :c:func:`malloc`,
|
||||
:c:func:`calloc`, :c:func:`realloc` and :c:func:`free`. This will result in mixed
|
||||
calls between the C allocator and the Python memory manager with fatal
|
||||
consequences, because they implement different algorithms and operate on
|
||||
different heaps. However, one may safely allocate and release memory blocks
|
||||
with the C library allocator for individual purposes, as shown in the following
|
||||
example::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = (char *) malloc(BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
...Do some I/O operation involving buf...
|
||||
res = PyBytes_FromString(buf);
|
||||
free(buf); /* malloc'ed */
|
||||
return res;
|
||||
|
||||
In this example, the memory request for the I/O buffer is handled by the C
|
||||
library allocator. The Python memory manager is involved only in the allocation
|
||||
of the bytes object returned as a result.
|
||||
|
||||
In most situations, however, it is recommended to allocate memory from the
|
||||
Python heap specifically because the latter is under control of the Python
|
||||
memory manager. For example, this is required when the interpreter is extended
|
||||
with new object types written in C. Another reason for using the Python heap is
|
||||
the desire to *inform* the Python memory manager about the memory needs of the
|
||||
extension module. Even when the requested memory is used exclusively for
|
||||
internal, highly-specific purposes, delegating all memory requests to the Python
|
||||
memory manager causes the interpreter to have a more accurate image of its
|
||||
memory footprint as a whole. Consequently, under certain circumstances, the
|
||||
Python memory manager may or may not trigger appropriate actions, like garbage
|
||||
collection, memory compaction or other preventive procedures. Note that by using
|
||||
the C library allocator as shown in the previous example, the allocated memory
|
||||
for the I/O buffer escapes completely the Python memory manager.
|
||||
|
||||
.. seealso::
|
||||
|
||||
The :envvar:`PYTHONMALLOC` environment variable can be used to configure
|
||||
the memory allocators used by Python.
|
||||
|
||||
The :envvar:`PYTHONMALLOCSTATS` environment variable can be used to print
|
||||
statistics of the :ref:`pymalloc memory allocator <pymalloc>` every time a
|
||||
new pymalloc object arena is created, and on shutdown.
|
||||
|
||||
|
||||
Raw Memory Interface
|
||||
====================
|
||||
|
||||
The following function sets are wrappers to the system allocator. These
|
||||
functions are thread-safe, the :term:`GIL <global interpreter lock>` does not
|
||||
need to be held.
|
||||
|
||||
The :ref:`default raw memory allocator <default-memory-allocators>` uses
|
||||
the following functions: :c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc`
|
||||
and :c:func:`free`; call ``malloc(1)`` (or ``calloc(1, 1)``) when requesting
|
||||
zero bytes.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. c:function:: void* PyMem_RawMalloc(size_t n)
|
||||
|
||||
Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
|
||||
allocated memory, or *NULL* if the request fails.
|
||||
|
||||
Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
|
||||
if ``PyMem_RawMalloc(1)`` had been called instead. The memory will not have
|
||||
been initialized in any way.
|
||||
|
||||
|
||||
.. c:function:: void* PyMem_RawCalloc(size_t nelem, size_t elsize)
|
||||
|
||||
Allocates *nelem* elements each whose size in bytes is *elsize* and returns
|
||||
a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
|
||||
request fails. The memory is initialized to zeros.
|
||||
|
||||
Requesting zero elements or elements of size zero bytes returns a distinct
|
||||
non-*NULL* pointer if possible, as if ``PyMem_RawCalloc(1, 1)`` had been
|
||||
called instead.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. c:function:: void* PyMem_RawRealloc(void *p, size_t n)
|
||||
|
||||
Resizes the memory block pointed to by *p* to *n* bytes. The contents will
|
||||
be unchanged to the minimum of the old and the new sizes.
|
||||
|
||||
If *p* is *NULL*, the call is equivalent to ``PyMem_RawMalloc(n)``; else if
|
||||
*n* is equal to zero, the memory block is resized but is not freed, and the
|
||||
returned pointer is non-*NULL*.
|
||||
|
||||
Unless *p* is *NULL*, it must have been returned by a previous call to
|
||||
:c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc` or
|
||||
:c:func:`PyMem_RawCalloc`.
|
||||
|
||||
If the request fails, :c:func:`PyMem_RawRealloc` returns *NULL* and *p*
|
||||
remains a valid pointer to the previous memory area.
|
||||
|
||||
|
||||
.. c:function:: void PyMem_RawFree(void *p)
|
||||
|
||||
Frees the memory block pointed to by *p*, which must have been returned by a
|
||||
previous call to :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc` or
|
||||
:c:func:`PyMem_RawCalloc`. Otherwise, or if ``PyMem_RawFree(p)`` has been
|
||||
called before, undefined behavior occurs.
|
||||
|
||||
If *p* is *NULL*, no operation is performed.
|
||||
|
||||
|
||||
.. _memoryinterface:
|
||||
|
||||
Memory Interface
|
||||
================
|
||||
|
||||
The following function sets, modeled after the ANSI C standard, but specifying
|
||||
behavior when requesting zero bytes, are available for allocating and releasing
|
||||
memory from the Python heap.
|
||||
|
||||
The :ref:`default memory allocator <default-memory-allocators>` uses the
|
||||
:ref:`pymalloc memory allocator <pymalloc>`.
|
||||
|
||||
.. warning::
|
||||
|
||||
The :term:`GIL <global interpreter lock>` must be held when using these
|
||||
functions.
|
||||
|
||||
.. versionchanged:: 3.6
|
||||
|
||||
The default allocator is now pymalloc instead of system :c:func:`malloc`.
|
||||
|
||||
.. c:function:: void* PyMem_Malloc(size_t n)
|
||||
|
||||
Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
|
||||
allocated memory, or *NULL* if the request fails.
|
||||
|
||||
Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
|
||||
if ``PyMem_Malloc(1)`` had been called instead. The memory will not have
|
||||
been initialized in any way.
|
||||
|
||||
|
||||
.. c:function:: void* PyMem_Calloc(size_t nelem, size_t elsize)
|
||||
|
||||
Allocates *nelem* elements each whose size in bytes is *elsize* and returns
|
||||
a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
|
||||
request fails. The memory is initialized to zeros.
|
||||
|
||||
Requesting zero elements or elements of size zero bytes returns a distinct
|
||||
non-*NULL* pointer if possible, as if ``PyMem_Calloc(1, 1)`` had been called
|
||||
instead.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. c:function:: void* PyMem_Realloc(void *p, size_t n)
|
||||
|
||||
Resizes the memory block pointed to by *p* to *n* bytes. The contents will be
|
||||
unchanged to the minimum of the old and the new sizes.
|
||||
|
||||
If *p* is *NULL*, the call is equivalent to ``PyMem_Malloc(n)``; else if *n*
|
||||
is equal to zero, the memory block is resized but is not freed, and the
|
||||
returned pointer is non-*NULL*.
|
||||
|
||||
Unless *p* is *NULL*, it must have been returned by a previous call to
|
||||
:c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc` or :c:func:`PyMem_Calloc`.
|
||||
|
||||
If the request fails, :c:func:`PyMem_Realloc` returns *NULL* and *p* remains
|
||||
a valid pointer to the previous memory area.
|
||||
|
||||
|
||||
.. c:function:: void PyMem_Free(void *p)
|
||||
|
||||
Frees the memory block pointed to by *p*, which must have been returned by a
|
||||
previous call to :c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc` or
|
||||
:c:func:`PyMem_Calloc`. Otherwise, or if ``PyMem_Free(p)`` has been called
|
||||
before, undefined behavior occurs.
|
||||
|
||||
If *p* is *NULL*, no operation is performed.
|
||||
|
||||
The following type-oriented macros are provided for convenience. Note that
|
||||
*TYPE* refers to any C type.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyMem_New(TYPE, size_t n)
|
||||
|
||||
Same as :c:func:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of
|
||||
memory. Returns a pointer cast to :c:type:`TYPE\*`. The memory will not have
|
||||
been initialized in any way.
|
||||
|
||||
|
||||
.. c:function:: TYPE* PyMem_Resize(void *p, TYPE, size_t n)
|
||||
|
||||
Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n *
|
||||
sizeof(TYPE))`` bytes. Returns a pointer cast to :c:type:`TYPE\*`. On return,
|
||||
*p* will be a pointer to the new memory area, or *NULL* in the event of
|
||||
failure.
|
||||
|
||||
This is a C preprocessor macro; *p* is always reassigned. Save the original
|
||||
value of *p* to avoid losing memory when handling errors.
|
||||
|
||||
|
||||
.. c:function:: void PyMem_Del(void *p)
|
||||
|
||||
Same as :c:func:`PyMem_Free`.
|
||||
|
||||
In addition, the following macro sets are provided for calling the Python memory
|
||||
allocator directly, without involving the C API functions listed above. However,
|
||||
note that their use does not preserve binary compatibility across Python
|
||||
versions and is therefore deprecated in extension modules.
|
||||
|
||||
* ``PyMem_MALLOC(size)``
|
||||
* ``PyMem_NEW(type, size)``
|
||||
* ``PyMem_REALLOC(ptr, size)``
|
||||
* ``PyMem_RESIZE(ptr, type, size)``
|
||||
* ``PyMem_FREE(ptr)``
|
||||
* ``PyMem_DEL(ptr)``
|
||||
|
||||
|
||||
Object allocators
|
||||
=================
|
||||
|
||||
The following function sets, modeled after the ANSI C standard, but specifying
|
||||
behavior when requesting zero bytes, are available for allocating and releasing
|
||||
memory from the Python heap.
|
||||
|
||||
The :ref:`default object allocator <default-memory-allocators>` uses the
|
||||
:ref:`pymalloc memory allocator <pymalloc>`.
|
||||
|
||||
.. warning::
|
||||
|
||||
The :term:`GIL <global interpreter lock>` must be held when using these
|
||||
functions.
|
||||
|
||||
.. c:function:: void* PyObject_Malloc(size_t n)
|
||||
|
||||
Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
|
||||
allocated memory, or *NULL* if the request fails.
|
||||
|
||||
Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
|
||||
if ``PyObject_Malloc(1)`` had been called instead. The memory will not have
|
||||
been initialized in any way.
|
||||
|
||||
|
||||
.. c:function:: void* PyObject_Calloc(size_t nelem, size_t elsize)
|
||||
|
||||
Allocates *nelem* elements each whose size in bytes is *elsize* and returns
|
||||
a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
|
||||
request fails. The memory is initialized to zeros.
|
||||
|
||||
Requesting zero elements or elements of size zero bytes returns a distinct
|
||||
non-*NULL* pointer if possible, as if ``PyObject_Calloc(1, 1)`` had been called
|
||||
instead.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. c:function:: void* PyObject_Realloc(void *p, size_t n)
|
||||
|
||||
Resizes the memory block pointed to by *p* to *n* bytes. The contents will be
|
||||
unchanged to the minimum of the old and the new sizes.
|
||||
|
||||
If *p* is *NULL*, the call is equivalent to ``PyObject_Malloc(n)``; else if *n*
|
||||
is equal to zero, the memory block is resized but is not freed, and the
|
||||
returned pointer is non-*NULL*.
|
||||
|
||||
Unless *p* is *NULL*, it must have been returned by a previous call to
|
||||
:c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc` or :c:func:`PyObject_Calloc`.
|
||||
|
||||
If the request fails, :c:func:`PyObject_Realloc` returns *NULL* and *p* remains
|
||||
a valid pointer to the previous memory area.
|
||||
|
||||
|
||||
.. c:function:: void PyObject_Free(void *p)
|
||||
|
||||
Frees the memory block pointed to by *p*, which must have been returned by a
|
||||
previous call to :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc` or
|
||||
:c:func:`PyObject_Calloc`. Otherwise, or if ``PyObject_Free(p)`` has been called
|
||||
before, undefined behavior occurs.
|
||||
|
||||
If *p* is *NULL*, no operation is performed.
|
||||
|
||||
|
||||
.. _default-memory-allocators:
|
||||
|
||||
Default Memory Allocators
|
||||
=========================
|
||||
|
||||
Default memory allocators:
|
||||
|
||||
=============================== ==================== ================== ===================== ====================
|
||||
Configuration Name PyMem_RawMalloc PyMem_Malloc PyObject_Malloc
|
||||
=============================== ==================== ================== ===================== ====================
|
||||
Release build ``"pymalloc"`` ``malloc`` ``pymalloc`` ``pymalloc``
|
||||
Debug build ``"pymalloc_debug"`` ``malloc`` + debug ``pymalloc`` + debug ``pymalloc`` + debug
|
||||
Release build, without pymalloc ``"malloc"`` ``malloc`` ``malloc`` ``malloc``
|
||||
Debug build, without pymalloc ``"malloc_debug"`` ``malloc`` + debug ``malloc`` + debug ``malloc`` + debug
|
||||
=============================== ==================== ================== ===================== ====================
|
||||
|
||||
Legend:
|
||||
|
||||
* Name: value for :envvar:`PYTHONMALLOC` environment variable
|
||||
* ``malloc``: system allocators from the standard C library, C functions:
|
||||
:c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free`
|
||||
* ``pymalloc``: :ref:`pymalloc memory allocator <pymalloc>`
|
||||
* "+ debug": with debug hooks installed by :c:func:`PyMem_SetupDebugHooks`
|
||||
|
||||
|
||||
Customize Memory Allocators
|
||||
===========================
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. c:type:: PyMemAllocatorEx
|
||||
|
||||
Structure used to describe a memory block allocator. The structure has
|
||||
four fields:
|
||||
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
| Field | Meaning |
|
||||
+==========================================================+=======================================+
|
||||
| ``void *ctx`` | user context passed as first argument |
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
| ``void* malloc(void *ctx, size_t size)`` | allocate a memory block |
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
| ``void* calloc(void *ctx, size_t nelem, size_t elsize)`` | allocate a memory block initialized |
|
||||
| | with zeros |
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
| ``void* realloc(void *ctx, void *ptr, size_t new_size)`` | allocate or resize a memory block |
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
| ``void free(void *ctx, void *ptr)`` | free a memory block |
|
||||
+----------------------------------------------------------+---------------------------------------+
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
The :c:type:`PyMemAllocator` structure was renamed to
|
||||
:c:type:`PyMemAllocatorEx` and a new ``calloc`` field was added.
|
||||
|
||||
|
||||
.. c:type:: PyMemAllocatorDomain
|
||||
|
||||
Enum used to identify an allocator domain. Domains:
|
||||
|
||||
.. c:var:: PYMEM_DOMAIN_RAW
|
||||
|
||||
Functions:
|
||||
|
||||
* :c:func:`PyMem_RawMalloc`
|
||||
* :c:func:`PyMem_RawRealloc`
|
||||
* :c:func:`PyMem_RawCalloc`
|
||||
* :c:func:`PyMem_RawFree`
|
||||
|
||||
.. c:var:: PYMEM_DOMAIN_MEM
|
||||
|
||||
Functions:
|
||||
|
||||
* :c:func:`PyMem_Malloc`,
|
||||
* :c:func:`PyMem_Realloc`
|
||||
* :c:func:`PyMem_Calloc`
|
||||
* :c:func:`PyMem_Free`
|
||||
|
||||
.. c:var:: PYMEM_DOMAIN_OBJ
|
||||
|
||||
Functions:
|
||||
|
||||
* :c:func:`PyObject_Malloc`
|
||||
* :c:func:`PyObject_Realloc`
|
||||
* :c:func:`PyObject_Calloc`
|
||||
* :c:func:`PyObject_Free`
|
||||
|
||||
.. c:function:: void PyMem_GetAllocator(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
|
||||
|
||||
Get the memory block allocator of the specified domain.
|
||||
|
||||
|
||||
.. c:function:: void PyMem_SetAllocator(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
|
||||
|
||||
Set the memory block allocator of the specified domain.
|
||||
|
||||
The new allocator must return a distinct non-NULL pointer when requesting
|
||||
zero bytes.
|
||||
|
||||
For the :c:data:`PYMEM_DOMAIN_RAW` domain, the allocator must be
|
||||
thread-safe: the :term:`GIL <global interpreter lock>` is not held when the
|
||||
allocator is called.
|
||||
|
||||
If the new allocator is not a hook (does not call the previous allocator),
|
||||
the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the
|
||||
debug hooks on top on the new allocator.
|
||||
|
||||
|
||||
.. c:function:: void PyMem_SetupDebugHooks(void)
|
||||
|
||||
Setup hooks to detect bugs in the Python memory allocator functions.
|
||||
|
||||
Newly allocated memory is filled with the byte ``0xCD`` (``CLEANBYTE``),
|
||||
freed memory is filled with the byte ``0xDD`` (``DEADBYTE``). Memory blocks
|
||||
are surrounded by "forbidden bytes" (``FORBIDDENBYTE``: byte ``0xFD``).
|
||||
|
||||
Runtime checks:
|
||||
|
||||
- Detect API violations, ex: :c:func:`PyObject_Free` called on a buffer
|
||||
allocated by :c:func:`PyMem_Malloc`
|
||||
- Detect write before the start of the buffer (buffer underflow)
|
||||
- Detect write after the end of the buffer (buffer overflow)
|
||||
- Check that the :term:`GIL <global interpreter lock>` is held when
|
||||
allocator functions of :c:data:`PYMEM_DOMAIN_OBJ` (ex:
|
||||
:c:func:`PyObject_Malloc`) and :c:data:`PYMEM_DOMAIN_MEM` (ex:
|
||||
:c:func:`PyMem_Malloc`) domains are called
|
||||
|
||||
On error, the debug hooks use the :mod:`tracemalloc` module to get the
|
||||
traceback where a memory block was allocated. The traceback is only
|
||||
displayed if :mod:`tracemalloc` is tracing Python memory allocations and the
|
||||
memory block was traced.
|
||||
|
||||
These hooks are :ref:`installed by default <default-memory-allocators>` if
|
||||
Python is compiled in debug
|
||||
mode. The :envvar:`PYTHONMALLOC` environment variable can be used to install
|
||||
debug hooks on a Python compiled in release mode.
|
||||
|
||||
.. versionchanged:: 3.6
|
||||
This function now also works on Python compiled in release mode.
|
||||
On error, the debug hooks now use :mod:`tracemalloc` to get the traceback
|
||||
where a memory block was allocated. The debug hooks now also check
|
||||
if the GIL is held when functions of :c:data:`PYMEM_DOMAIN_OBJ` and
|
||||
:c:data:`PYMEM_DOMAIN_MEM` domains are called.
|
||||
|
||||
.. versionchanged:: 3.7.3
|
||||
Byte patterns ``0xCB`` (``CLEANBYTE``), ``0xDB`` (``DEADBYTE``) and
|
||||
``0xFB`` (``FORBIDDENBYTE``) have been replaced with ``0xCD``, ``0xDD``
|
||||
and ``0xFD`` to use the same values than Windows CRT debug ``malloc()``
|
||||
and ``free()``.
|
||||
|
||||
|
||||
.. _pymalloc:
|
||||
|
||||
The pymalloc allocator
|
||||
======================
|
||||
|
||||
Python has a *pymalloc* allocator optimized for small objects (smaller or equal
|
||||
to 512 bytes) with a short lifetime. It uses memory mappings called "arenas"
|
||||
with a fixed size of 256 KiB. It falls back to :c:func:`PyMem_RawMalloc` and
|
||||
:c:func:`PyMem_RawRealloc` for allocations larger than 512 bytes.
|
||||
|
||||
*pymalloc* is the :ref:`default allocator <default-memory-allocators>` of the
|
||||
:c:data:`PYMEM_DOMAIN_MEM` (ex: :c:func:`PyMem_Malloc`) and
|
||||
:c:data:`PYMEM_DOMAIN_OBJ` (ex: :c:func:`PyObject_Malloc`) domains.
|
||||
|
||||
The arena allocator uses the following functions:
|
||||
|
||||
* :c:func:`VirtualAlloc` and :c:func:`VirtualFree` on Windows,
|
||||
* :c:func:`mmap` and :c:func:`munmap` if available,
|
||||
* :c:func:`malloc` and :c:func:`free` otherwise.
|
||||
|
||||
Customize pymalloc Arena Allocator
|
||||
----------------------------------
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. c:type:: PyObjectArenaAllocator
|
||||
|
||||
Structure used to describe an arena allocator. The structure has
|
||||
three fields:
|
||||
|
||||
+--------------------------------------------------+---------------------------------------+
|
||||
| Field | Meaning |
|
||||
+==================================================+=======================================+
|
||||
| ``void *ctx`` | user context passed as first argument |
|
||||
+--------------------------------------------------+---------------------------------------+
|
||||
| ``void* alloc(void *ctx, size_t size)`` | allocate an arena of size bytes |
|
||||
+--------------------------------------------------+---------------------------------------+
|
||||
| ``void free(void *ctx, size_t size, void *ptr)`` | free an arena |
|
||||
+--------------------------------------------------+---------------------------------------+
|
||||
|
||||
.. c:function:: PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)
|
||||
|
||||
Get the arena allocator.
|
||||
|
||||
.. c:function:: PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)
|
||||
|
||||
Set the arena allocator.
|
||||
|
||||
|
||||
tracemalloc C API
|
||||
=================
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. c:function: int PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, size_t size)
|
||||
|
||||
Track an allocated memory block in the :mod:`tracemalloc` module.
|
||||
|
||||
Return ``0`` on success, return ``-1`` on error (failed to allocate memory to
|
||||
store the trace). Return ``-2`` if tracemalloc is disabled.
|
||||
|
||||
If memory block is already tracked, update the existing trace.
|
||||
|
||||
.. c:function: int PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr)
|
||||
|
||||
Untrack an allocated memory block in the :mod:`tracemalloc` module.
|
||||
Do nothing if the block was not tracked.
|
||||
|
||||
Return ``-2`` if tracemalloc is disabled, otherwise return ``0``.
|
||||
|
||||
|
||||
.. _memoryexamples:
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
Here is the example from section :ref:`memoryoverview`, rewritten so that the
|
||||
I/O buffer is allocated from the Python heap by using the first function set::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
/* ...Do some I/O operation involving buf... */
|
||||
res = PyBytes_FromString(buf);
|
||||
PyMem_Free(buf); /* allocated with PyMem_Malloc */
|
||||
return res;
|
||||
|
||||
The same code using the type-oriented function set::
|
||||
|
||||
PyObject *res;
|
||||
char *buf = PyMem_New(char, BUFSIZ); /* for I/O */
|
||||
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
/* ...Do some I/O operation involving buf... */
|
||||
res = PyBytes_FromString(buf);
|
||||
PyMem_Del(buf); /* allocated with PyMem_New */
|
||||
return res;
|
||||
|
||||
Note that in the two examples above, the buffer is always manipulated via
|
||||
functions belonging to the same set. Indeed, it is required to use the same
|
||||
memory API family for a given memory block, so that the risk of mixing different
|
||||
allocators is reduced to a minimum. The following code sequence contains two
|
||||
errors, one of which is labeled as *fatal* because it mixes two different
|
||||
allocators operating on different heaps. ::
|
||||
|
||||
char *buf1 = PyMem_New(char, BUFSIZ);
|
||||
char *buf2 = (char *) malloc(BUFSIZ);
|
||||
char *buf3 = (char *) PyMem_Malloc(BUFSIZ);
|
||||
...
|
||||
PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */
|
||||
free(buf2); /* Right -- allocated via malloc() */
|
||||
free(buf1); /* Fatal -- should be PyMem_Del() */
|
||||
|
||||
In addition to the functions aimed at handling raw memory blocks from the Python
|
||||
heap, objects in Python are allocated and released with :c:func:`PyObject_New`,
|
||||
:c:func:`PyObject_NewVar` and :c:func:`PyObject_Del`.
|
||||
|
||||
These will be explained in the next chapter on defining and implementing new
|
||||
object types in C.
|
||||
|
||||
63
python-3.7.4-docs-html/_sources/c-api/memoryview.rst.txt
Normal file
63
python-3.7.4-docs-html/_sources/c-api/memoryview.rst.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _memoryview-objects:
|
||||
|
||||
.. index::
|
||||
object: memoryview
|
||||
|
||||
MemoryView objects
|
||||
------------------
|
||||
|
||||
A :class:`memoryview` object exposes the C level :ref:`buffer interface
|
||||
<bufferobjects>` as a Python object which can then be passed around like
|
||||
any other object.
|
||||
|
||||
|
||||
.. c:function:: PyObject *PyMemoryView_FromObject(PyObject *obj)
|
||||
|
||||
Create a memoryview object from an object that provides the buffer interface.
|
||||
If *obj* supports writable buffer exports, the memoryview object will be
|
||||
read/write, otherwise it may be either read-only or read/write at the
|
||||
discretion of the exporter.
|
||||
|
||||
.. c:function:: PyObject *PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
|
||||
|
||||
Create a memoryview object using *mem* as the underlying buffer.
|
||||
*flags* can be one of :c:macro:`PyBUF_READ` or :c:macro:`PyBUF_WRITE`.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:function:: PyObject *PyMemoryView_FromBuffer(Py_buffer *view)
|
||||
|
||||
Create a memoryview object wrapping the given buffer structure *view*.
|
||||
For simple byte buffers, :c:func:`PyMemoryView_FromMemory` is the preferred
|
||||
function.
|
||||
|
||||
.. c:function:: PyObject *PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char order)
|
||||
|
||||
Create a memoryview object to a :term:`contiguous` chunk of memory (in either
|
||||
'C' or 'F'ortran *order*) from an object that defines the buffer
|
||||
interface. If memory is contiguous, the memoryview object points to the
|
||||
original memory. Otherwise, a copy is made and the memoryview points to a
|
||||
new bytes object.
|
||||
|
||||
|
||||
.. c:function:: int PyMemoryView_Check(PyObject *obj)
|
||||
|
||||
Return true if the object *obj* is a memoryview object. It is not
|
||||
currently allowed to create subclasses of :class:`memoryview`.
|
||||
|
||||
|
||||
.. c:function:: Py_buffer *PyMemoryView_GET_BUFFER(PyObject *mview)
|
||||
|
||||
Return a pointer to the memoryview's private copy of the exporter's buffer.
|
||||
*mview* **must** be a memoryview instance; this macro doesn't check its type,
|
||||
you must do it yourself or you will risk crashes.
|
||||
|
||||
.. c:function:: Py_buffer *PyMemoryView_GET_BASE(PyObject *mview)
|
||||
|
||||
Return either a pointer to the exporting object that the memoryview is based
|
||||
on or *NULL* if the memoryview has been created by one of the functions
|
||||
:c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`.
|
||||
*mview* **must** be a memoryview instance.
|
||||
|
||||
100
python-3.7.4-docs-html/_sources/c-api/method.rst.txt
Normal file
100
python-3.7.4-docs-html/_sources/c-api/method.rst.txt
Normal file
@@ -0,0 +1,100 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _instancemethod-objects:
|
||||
|
||||
Instance Method Objects
|
||||
-----------------------
|
||||
|
||||
.. index:: object: instancemethod
|
||||
|
||||
An instance method is a wrapper for a :c:data:`PyCFunction` and the new way
|
||||
to bind a :c:data:`PyCFunction` to a class object. It replaces the former call
|
||||
``PyMethod_New(func, NULL, class)``.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyInstanceMethod_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python instance
|
||||
method type. It is not exposed to Python programs.
|
||||
|
||||
|
||||
.. c:function:: int PyInstanceMethod_Check(PyObject *o)
|
||||
|
||||
Return true if *o* is an instance method object (has type
|
||||
:c:data:`PyInstanceMethod_Type`). The parameter must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyInstanceMethod_New(PyObject *func)
|
||||
|
||||
Return a new instance method object, with *func* being any callable object
|
||||
*func* is the function that will be called when the instance method is
|
||||
called.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyInstanceMethod_Function(PyObject *im)
|
||||
|
||||
Return the function object associated with the instance method *im*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyInstanceMethod_GET_FUNCTION(PyObject *im)
|
||||
|
||||
Macro version of :c:func:`PyInstanceMethod_Function` which avoids error checking.
|
||||
|
||||
|
||||
.. _method-objects:
|
||||
|
||||
Method Objects
|
||||
--------------
|
||||
|
||||
.. index:: object: method
|
||||
|
||||
Methods are bound function objects. Methods are always bound to an instance of
|
||||
a user-defined class. Unbound methods (methods bound to a class object) are
|
||||
no longer available.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyMethod_Type
|
||||
|
||||
.. index:: single: MethodType (in module types)
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python method type. This
|
||||
is exposed to Python programs as ``types.MethodType``.
|
||||
|
||||
|
||||
.. c:function:: int PyMethod_Check(PyObject *o)
|
||||
|
||||
Return true if *o* is a method object (has type :c:data:`PyMethod_Type`). The
|
||||
parameter must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMethod_New(PyObject *func, PyObject *self)
|
||||
|
||||
Return a new method object, with *func* being any callable object and *self*
|
||||
the instance the method should be bound. *func* is the function that will
|
||||
be called when the method is called. *self* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMethod_Function(PyObject *meth)
|
||||
|
||||
Return the function object associated with the method *meth*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMethod_GET_FUNCTION(PyObject *meth)
|
||||
|
||||
Macro version of :c:func:`PyMethod_Function` which avoids error checking.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMethod_Self(PyObject *meth)
|
||||
|
||||
Return the instance associated with the method *meth*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyMethod_GET_SELF(PyObject *meth)
|
||||
|
||||
Macro version of :c:func:`PyMethod_Self` which avoids error checking.
|
||||
|
||||
|
||||
.. c:function:: int PyMethod_ClearFreeList()
|
||||
|
||||
Clear the free list. Return the total number of freed items.
|
||||
|
||||
479
python-3.7.4-docs-html/_sources/c-api/module.rst.txt
Normal file
479
python-3.7.4-docs-html/_sources/c-api/module.rst.txt
Normal file
@@ -0,0 +1,479 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _moduleobjects:
|
||||
|
||||
Module Objects
|
||||
--------------
|
||||
|
||||
.. index:: object: module
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyModule_Type
|
||||
|
||||
.. index:: single: ModuleType (in module types)
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python module type. This
|
||||
is exposed to Python programs as ``types.ModuleType``.
|
||||
|
||||
|
||||
.. c:function:: int PyModule_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a module object, or a subtype of a module object.
|
||||
|
||||
|
||||
.. c:function:: int PyModule_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a module object, but not a subtype of
|
||||
:c:data:`PyModule_Type`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_NewObject(PyObject *name)
|
||||
|
||||
.. index::
|
||||
single: __name__ (module attribute)
|
||||
single: __doc__ (module attribute)
|
||||
single: __file__ (module attribute)
|
||||
single: __package__ (module attribute)
|
||||
single: __loader__ (module attribute)
|
||||
|
||||
Return a new module object with the :attr:`__name__` attribute set to *name*.
|
||||
The module's :attr:`__name__`, :attr:`__doc__`, :attr:`__package__`, and
|
||||
:attr:`__loader__` attributes are filled in (all but :attr:`__name__` are set
|
||||
to ``None``); the caller is responsible for providing a :attr:`__file__`
|
||||
attribute.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
:attr:`__package__` and :attr:`__loader__` are set to ``None``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_New(const char *name)
|
||||
|
||||
Similar to :c:func:`PyModule_NewObject`, but the name is a UTF-8 encoded
|
||||
string instead of a Unicode object.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_GetDict(PyObject *module)
|
||||
|
||||
.. index:: single: __dict__ (module attribute)
|
||||
|
||||
Return the dictionary object that implements *module*'s namespace; this object
|
||||
is the same as the :attr:`~object.__dict__` attribute of the module object.
|
||||
If *module* is not a module object (or a subtype of a module object),
|
||||
:exc:`SystemError` is raised and *NULL* is returned.
|
||||
|
||||
It is recommended extensions use other :c:func:`PyModule_\*` and
|
||||
:c:func:`PyObject_\*` functions rather than directly manipulate a module's
|
||||
:attr:`~object.__dict__`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_GetNameObject(PyObject *module)
|
||||
|
||||
.. index::
|
||||
single: __name__ (module attribute)
|
||||
single: SystemError (built-in exception)
|
||||
|
||||
Return *module*'s :attr:`__name__` value. If the module does not provide one,
|
||||
or if it is not a string, :exc:`SystemError` is raised and *NULL* is returned.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: const char* PyModule_GetName(PyObject *module)
|
||||
|
||||
Similar to :c:func:`PyModule_GetNameObject` but return the name encoded to
|
||||
``'utf-8'``.
|
||||
|
||||
.. c:function:: void* PyModule_GetState(PyObject *module)
|
||||
|
||||
Return the "state" of the module, that is, a pointer to the block of memory
|
||||
allocated at module creation time, or *NULL*. See
|
||||
:c:member:`PyModuleDef.m_size`.
|
||||
|
||||
|
||||
.. c:function:: PyModuleDef* PyModule_GetDef(PyObject *module)
|
||||
|
||||
Return a pointer to the :c:type:`PyModuleDef` struct from which the module was
|
||||
created, or *NULL* if the module wasn't created from a definition.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_GetFilenameObject(PyObject *module)
|
||||
|
||||
.. index::
|
||||
single: __file__ (module attribute)
|
||||
single: SystemError (built-in exception)
|
||||
|
||||
Return the name of the file from which *module* was loaded using *module*'s
|
||||
:attr:`__file__` attribute. If this is not defined, or if it is not a
|
||||
unicode string, raise :exc:`SystemError` and return *NULL*; otherwise return
|
||||
a reference to a Unicode object.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
|
||||
.. c:function:: const char* PyModule_GetFilename(PyObject *module)
|
||||
|
||||
Similar to :c:func:`PyModule_GetFilenameObject` but return the filename
|
||||
encoded to 'utf-8'.
|
||||
|
||||
.. deprecated:: 3.2
|
||||
:c:func:`PyModule_GetFilename` raises :c:type:`UnicodeEncodeError` on
|
||||
unencodable filenames, use :c:func:`PyModule_GetFilenameObject` instead.
|
||||
|
||||
|
||||
.. _initializing-modules:
|
||||
|
||||
Initializing C modules
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Modules objects are usually created from extension modules (shared libraries
|
||||
which export an initialization function), or compiled-in modules
|
||||
(where the initialization function is added using :c:func:`PyImport_AppendInittab`).
|
||||
See :ref:`building` or :ref:`extending-with-embedding` for details.
|
||||
|
||||
The initialization function can either pass a module definition instance
|
||||
to :c:func:`PyModule_Create`, and return the resulting module object,
|
||||
or request "multi-phase initialization" by returning the definition struct itself.
|
||||
|
||||
.. c:type:: PyModuleDef
|
||||
|
||||
The module definition struct, which holds all information needed to create
|
||||
a module object. There is usually only one statically initialized variable
|
||||
of this type for each module.
|
||||
|
||||
.. c:member:: PyModuleDef_Base m_base
|
||||
|
||||
Always initialize this member to :const:`PyModuleDef_HEAD_INIT`.
|
||||
|
||||
.. c:member:: const char *m_name
|
||||
|
||||
Name for the new module.
|
||||
|
||||
.. c:member:: const char *m_doc
|
||||
|
||||
Docstring for the module; usually a docstring variable created with
|
||||
:c:func:`PyDoc_STRVAR` is used.
|
||||
|
||||
.. c:member:: Py_ssize_t m_size
|
||||
|
||||
Module state may be kept in a per-module memory area that can be
|
||||
retrieved with :c:func:`PyModule_GetState`, rather than in static globals.
|
||||
This makes modules safe for use in multiple sub-interpreters.
|
||||
|
||||
This memory area is allocated based on *m_size* on module creation,
|
||||
and freed when the module object is deallocated, after the
|
||||
:c:member:`m_free` function has been called, if present.
|
||||
|
||||
Setting ``m_size`` to ``-1`` means that the module does not support
|
||||
sub-interpreters, because it has global state.
|
||||
|
||||
Setting it to a non-negative value means that the module can be
|
||||
re-initialized and specifies the additional amount of memory it requires
|
||||
for its state. Non-negative ``m_size`` is required for multi-phase
|
||||
initialization.
|
||||
|
||||
See :PEP:`3121` for more details.
|
||||
|
||||
.. c:member:: PyMethodDef* m_methods
|
||||
|
||||
A pointer to a table of module-level functions, described by
|
||||
:c:type:`PyMethodDef` values. Can be *NULL* if no functions are present.
|
||||
|
||||
.. c:member:: PyModuleDef_Slot* m_slots
|
||||
|
||||
An array of slot definitions for multi-phase initialization, terminated by
|
||||
a ``{0, NULL}`` entry.
|
||||
When using single-phase initialization, *m_slots* must be *NULL*.
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
|
||||
Prior to version 3.5, this member was always set to *NULL*,
|
||||
and was defined as:
|
||||
|
||||
.. c:member:: inquiry m_reload
|
||||
|
||||
.. c:member:: traverseproc m_traverse
|
||||
|
||||
A traversal function to call during GC traversal of the module object, or
|
||||
*NULL* if not needed. This function may be called before module state
|
||||
is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
|
||||
and before the :c:member:`Py_mod_exec` function is executed.
|
||||
|
||||
.. c:member:: inquiry m_clear
|
||||
|
||||
A clear function to call during GC clearing of the module object, or
|
||||
*NULL* if not needed. This function may be called before module state
|
||||
is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
|
||||
and before the :c:member:`Py_mod_exec` function is executed.
|
||||
|
||||
.. c:member:: freefunc m_free
|
||||
|
||||
A function to call during deallocation of the module object, or *NULL* if
|
||||
not needed. This function may be called before module state
|
||||
is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
|
||||
and before the :c:member:`Py_mod_exec` function is executed.
|
||||
|
||||
Single-phase initialization
|
||||
...........................
|
||||
|
||||
The module initialization function may create and return the module object
|
||||
directly. This is referred to as "single-phase initialization", and uses one
|
||||
of the following two module creation functions:
|
||||
|
||||
.. c:function:: PyObject* PyModule_Create(PyModuleDef *def)
|
||||
|
||||
Create a new module object, given the definition in *def*. This behaves
|
||||
like :c:func:`PyModule_Create2` with *module_api_version* set to
|
||||
:const:`PYTHON_API_VERSION`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyModule_Create2(PyModuleDef *def, int module_api_version)
|
||||
|
||||
Create a new module object, given the definition in *def*, assuming the
|
||||
API version *module_api_version*. If that version does not match the version
|
||||
of the running interpreter, a :exc:`RuntimeWarning` is emitted.
|
||||
|
||||
.. note::
|
||||
|
||||
Most uses of this function should be using :c:func:`PyModule_Create`
|
||||
instead; only use this if you are sure you need it.
|
||||
|
||||
Before it is returned from in the initialization function, the resulting module
|
||||
object is typically populated using functions like :c:func:`PyModule_AddObject`.
|
||||
|
||||
.. _multi-phase-initialization:
|
||||
|
||||
Multi-phase initialization
|
||||
..........................
|
||||
|
||||
An alternate way to specify extensions is to request "multi-phase initialization".
|
||||
Extension modules created this way behave more like Python modules: the
|
||||
initialization is split between the *creation phase*, when the module object
|
||||
is created, and the *execution phase*, when it is populated.
|
||||
The distinction is similar to the :py:meth:`__new__` and :py:meth:`__init__` methods
|
||||
of classes.
|
||||
|
||||
Unlike modules created using single-phase initialization, these modules are not
|
||||
singletons: if the *sys.modules* entry is removed and the module is re-imported,
|
||||
a new module object is created, and the old module is subject to normal garbage
|
||||
collection -- as with Python modules.
|
||||
By default, multiple modules created from the same definition should be
|
||||
independent: changes to one should not affect the others.
|
||||
This means that all state should be specific to the module object (using e.g.
|
||||
using :c:func:`PyModule_GetState`), or its contents (such as the module's
|
||||
:attr:`__dict__` or individual classes created with :c:func:`PyType_FromSpec`).
|
||||
|
||||
All modules created using multi-phase initialization are expected to support
|
||||
:ref:`sub-interpreters <sub-interpreter-support>`. Making sure multiple modules
|
||||
are independent is typically enough to achieve this.
|
||||
|
||||
To request multi-phase initialization, the initialization function
|
||||
(PyInit_modulename) returns a :c:type:`PyModuleDef` instance with non-empty
|
||||
:c:member:`~PyModuleDef.m_slots`. Before it is returned, the ``PyModuleDef``
|
||||
instance must be initialized with the following function:
|
||||
|
||||
.. c:function:: PyObject* PyModuleDef_Init(PyModuleDef *def)
|
||||
|
||||
Ensures a module definition is a properly initialized Python object that
|
||||
correctly reports its type and reference count.
|
||||
|
||||
Returns *def* cast to ``PyObject*``, or *NULL* if an error occurred.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
The *m_slots* member of the module definition must point to an array of
|
||||
``PyModuleDef_Slot`` structures:
|
||||
|
||||
.. c:type:: PyModuleDef_Slot
|
||||
|
||||
.. c:member:: int slot
|
||||
|
||||
A slot ID, chosen from the available values explained below.
|
||||
|
||||
.. c:member:: void* value
|
||||
|
||||
Value of the slot, whose meaning depends on the slot ID.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
The *m_slots* array must be terminated by a slot with id 0.
|
||||
|
||||
The available slot types are:
|
||||
|
||||
.. c:var:: Py_mod_create
|
||||
|
||||
Specifies a function that is called to create the module object itself.
|
||||
The *value* pointer of this slot must point to a function of the signature:
|
||||
|
||||
.. c:function:: PyObject* create_module(PyObject *spec, PyModuleDef *def)
|
||||
|
||||
The function receives a :py:class:`~importlib.machinery.ModuleSpec`
|
||||
instance, as defined in :PEP:`451`, and the module definition.
|
||||
It should return a new module object, or set an error
|
||||
and return *NULL*.
|
||||
|
||||
This function should be kept minimal. In particular, it should not
|
||||
call arbitrary Python code, as trying to import the same module again may
|
||||
result in an infinite loop.
|
||||
|
||||
Multiple ``Py_mod_create`` slots may not be specified in one module
|
||||
definition.
|
||||
|
||||
If ``Py_mod_create`` is not specified, the import machinery will create
|
||||
a normal module object using :c:func:`PyModule_New`. The name is taken from
|
||||
*spec*, not the definition, to allow extension modules to dynamically adjust
|
||||
to their place in the module hierarchy and be imported under different
|
||||
names through symlinks, all while sharing a single module definition.
|
||||
|
||||
There is no requirement for the returned object to be an instance of
|
||||
:c:type:`PyModule_Type`. Any type can be used, as long as it supports
|
||||
setting and getting import-related attributes.
|
||||
However, only ``PyModule_Type`` instances may be returned if the
|
||||
``PyModuleDef`` has non-*NULL* ``m_traverse``, ``m_clear``,
|
||||
``m_free``; non-zero ``m_size``; or slots other than ``Py_mod_create``.
|
||||
|
||||
.. c:var:: Py_mod_exec
|
||||
|
||||
Specifies a function that is called to *execute* the module.
|
||||
This is equivalent to executing the code of a Python module: typically,
|
||||
this function adds classes and constants to the module.
|
||||
The signature of the function is:
|
||||
|
||||
.. c:function:: int exec_module(PyObject* module)
|
||||
|
||||
If multiple ``Py_mod_exec`` slots are specified, they are processed in the
|
||||
order they appear in the *m_slots* array.
|
||||
|
||||
See :PEP:`489` for more details on multi-phase initialization.
|
||||
|
||||
Low-level module creation functions
|
||||
...................................
|
||||
|
||||
The following functions are called under the hood when using multi-phase
|
||||
initialization. They can be used directly, for example when creating module
|
||||
objects dynamically. Note that both ``PyModule_FromDefAndSpec`` and
|
||||
``PyModule_ExecDef`` must be called to fully initialize a module.
|
||||
|
||||
.. c:function:: PyObject * PyModule_FromDefAndSpec(PyModuleDef *def, PyObject *spec)
|
||||
|
||||
Create a new module object, given the definition in *module* and the
|
||||
ModuleSpec *spec*. This behaves like :c:func:`PyModule_FromDefAndSpec2`
|
||||
with *module_api_version* set to :const:`PYTHON_API_VERSION`.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. c:function:: PyObject * PyModule_FromDefAndSpec2(PyModuleDef *def, PyObject *spec, int module_api_version)
|
||||
|
||||
Create a new module object, given the definition in *module* and the
|
||||
ModuleSpec *spec*, assuming the API version *module_api_version*.
|
||||
If that version does not match the version of the running interpreter,
|
||||
a :exc:`RuntimeWarning` is emitted.
|
||||
|
||||
.. note::
|
||||
|
||||
Most uses of this function should be using :c:func:`PyModule_FromDefAndSpec`
|
||||
instead; only use this if you are sure you need it.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. c:function:: int PyModule_ExecDef(PyObject *module, PyModuleDef *def)
|
||||
|
||||
Process any execution slots (:c:data:`Py_mod_exec`) given in *def*.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. c:function:: int PyModule_SetDocString(PyObject *module, const char *docstring)
|
||||
|
||||
Set the docstring for *module* to *docstring*.
|
||||
This function is called automatically when creating a module from
|
||||
``PyModuleDef``, using either ``PyModule_Create`` or
|
||||
``PyModule_FromDefAndSpec``.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. c:function:: int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)
|
||||
|
||||
Add the functions from the *NULL* terminated *functions* array to *module*.
|
||||
Refer to the :c:type:`PyMethodDef` documentation for details on individual
|
||||
entries (due to the lack of a shared module namespace, module level
|
||||
"functions" implemented in C typically receive the module as their first
|
||||
parameter, making them similar to instance methods on Python classes).
|
||||
This function is called automatically when creating a module from
|
||||
``PyModuleDef``, using either ``PyModule_Create`` or
|
||||
``PyModule_FromDefAndSpec``.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
Support functions
|
||||
.................
|
||||
|
||||
The module initialization function (if using single phase initialization) or
|
||||
a function called from a module execution slot (if using multi-phase
|
||||
initialization), can use the following functions to help initialize the module
|
||||
state:
|
||||
|
||||
.. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)
|
||||
|
||||
Add an object to *module* as *name*. This is a convenience function which can
|
||||
be used from the module's initialization function. This steals a reference to
|
||||
*value*. Return ``-1`` on error, ``0`` on success.
|
||||
|
||||
.. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
|
||||
|
||||
Add an integer constant to *module* as *name*. This convenience function can be
|
||||
used from the module's initialization function. Return ``-1`` on error, ``0`` on
|
||||
success.
|
||||
|
||||
|
||||
.. c:function:: int PyModule_AddStringConstant(PyObject *module, const char *name, const char *value)
|
||||
|
||||
Add a string constant to *module* as *name*. This convenience function can be
|
||||
used from the module's initialization function. The string *value* must be
|
||||
*NULL*-terminated. Return ``-1`` on error, ``0`` on success.
|
||||
|
||||
|
||||
.. c:function:: int PyModule_AddIntMacro(PyObject *module, macro)
|
||||
|
||||
Add an int constant to *module*. The name and the value are taken from
|
||||
*macro*. For example ``PyModule_AddIntMacro(module, AF_INET)`` adds the int
|
||||
constant *AF_INET* with the value of *AF_INET* to *module*.
|
||||
Return ``-1`` on error, ``0`` on success.
|
||||
|
||||
|
||||
.. c:function:: int PyModule_AddStringMacro(PyObject *module, macro)
|
||||
|
||||
Add a string constant to *module*.
|
||||
|
||||
|
||||
Module lookup
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
Single-phase initialization creates singleton modules that can be looked up
|
||||
in the context of the current interpreter. This allows the module object to be
|
||||
retrieved later with only a reference to the module definition.
|
||||
|
||||
These functions will not work on modules created using multi-phase initialization,
|
||||
since multiple such modules can be created from a single definition.
|
||||
|
||||
.. c:function:: PyObject* PyState_FindModule(PyModuleDef *def)
|
||||
|
||||
Returns the module object that was created from *def* for the current interpreter.
|
||||
This method requires that the module object has been attached to the interpreter state with
|
||||
:c:func:`PyState_AddModule` beforehand. In case the corresponding module object is not
|
||||
found or has not been attached to the interpreter state yet, it returns *NULL*.
|
||||
|
||||
.. c:function:: int PyState_AddModule(PyObject *module, PyModuleDef *def)
|
||||
|
||||
Attaches the module object passed to the function to the interpreter state. This allows
|
||||
the module object to be accessible via :c:func:`PyState_FindModule`.
|
||||
|
||||
Only effective on modules created using single-phase initialization.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:function:: int PyState_RemoveModule(PyModuleDef *def)
|
||||
|
||||
Removes the module object created from *def* from the interpreter state.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
26
python-3.7.4-docs-html/_sources/c-api/none.rst.txt
Normal file
26
python-3.7.4-docs-html/_sources/c-api/none.rst.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _noneobject:
|
||||
|
||||
The ``None`` Object
|
||||
-------------------
|
||||
|
||||
.. index:: object: None
|
||||
|
||||
Note that the :c:type:`PyTypeObject` for ``None`` is not directly exposed in the
|
||||
Python/C API. Since ``None`` is a singleton, testing for object identity (using
|
||||
``==`` in C) is sufficient. There is no :c:func:`PyNone_Check` function for the
|
||||
same reason.
|
||||
|
||||
|
||||
.. c:var:: PyObject* Py_None
|
||||
|
||||
The Python ``None`` object, denoting lack of value. This object has no methods.
|
||||
It needs to be treated just like any other object with respect to reference
|
||||
counts.
|
||||
|
||||
|
||||
.. c:macro:: Py_RETURN_NONE
|
||||
|
||||
Properly handle returning :c:data:`Py_None` from within a C function (that is,
|
||||
increment the reference count of ``None`` and return it.)
|
||||
283
python-3.7.4-docs-html/_sources/c-api/number.rst.txt
Normal file
283
python-3.7.4-docs-html/_sources/c-api/number.rst.txt
Normal file
@@ -0,0 +1,283 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _number:
|
||||
|
||||
Number Protocol
|
||||
===============
|
||||
|
||||
|
||||
.. c:function:: int PyNumber_Check(PyObject *o)
|
||||
|
||||
Returns ``1`` if the object *o* provides numeric protocols, and false otherwise.
|
||||
This function always succeeds.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of adding *o1* and *o2*, or *NULL* on failure. This is the
|
||||
equivalent of the Python expression ``o1 + o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Subtract(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of subtracting *o2* from *o1*, or *NULL* on failure. This is
|
||||
the equivalent of the Python expression ``o1 - o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Multiply(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of multiplying *o1* and *o2*, or *NULL* on failure. This is
|
||||
the equivalent of the Python expression ``o1 * o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o1 @ o2``.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2)
|
||||
|
||||
Return the floor of *o1* divided by *o2*, or *NULL* on failure. This is
|
||||
equivalent to the "classic" division of integers.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_TrueDivide(PyObject *o1, PyObject *o2)
|
||||
|
||||
Return a reasonable approximation for the mathematical value of *o1* divided by
|
||||
*o2*, or *NULL* on failure. The return value is "approximate" because binary
|
||||
floating point numbers are approximate; it is not possible to represent all real
|
||||
numbers in base two. This function can return a floating point value when
|
||||
passed two integers.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Remainder(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the remainder of dividing *o1* by *o2*, or *NULL* on failure. This is
|
||||
the equivalent of the Python expression ``o1 % o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Divmod(PyObject *o1, PyObject *o2)
|
||||
|
||||
.. index:: builtin: divmod
|
||||
|
||||
See the built-in function :func:`divmod`. Returns *NULL* on failure. This is
|
||||
the equivalent of the Python expression ``divmod(o1, o2)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)
|
||||
|
||||
.. index:: builtin: pow
|
||||
|
||||
See the built-in function :func:`pow`. Returns *NULL* on failure. This is the
|
||||
equivalent of the Python expression ``pow(o1, o2, o3)``, where *o3* is optional.
|
||||
If *o3* is to be ignored, pass :c:data:`Py_None` in its place (passing *NULL* for
|
||||
*o3* would cause an illegal memory access).
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Negative(PyObject *o)
|
||||
|
||||
Returns the negation of *o* on success, or *NULL* on failure. This is the
|
||||
equivalent of the Python expression ``-o``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Positive(PyObject *o)
|
||||
|
||||
Returns *o* on success, or *NULL* on failure. This is the equivalent of the
|
||||
Python expression ``+o``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Absolute(PyObject *o)
|
||||
|
||||
.. index:: builtin: abs
|
||||
|
||||
Returns the absolute value of *o*, or *NULL* on failure. This is the equivalent
|
||||
of the Python expression ``abs(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Invert(PyObject *o)
|
||||
|
||||
Returns the bitwise negation of *o* on success, or *NULL* on failure. This is
|
||||
the equivalent of the Python expression ``~o``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Lshift(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of left shifting *o1* by *o2* on success, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o1 << o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Rshift(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of right shifting *o1* by *o2* on success, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o1 >> o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_And(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise and" of *o1* and *o2* on success and *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``o1 & o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Xor(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise exclusive or" of *o1* by *o2* on success, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o1 ^ o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Or(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise or" of *o1* and *o2* on success, or *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``o1 | o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of adding *o1* and *o2*, or *NULL* on failure. The operation
|
||||
is done *in-place* when *o1* supports it. This is the equivalent of the Python
|
||||
statement ``o1 += o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of subtracting *o2* from *o1*, or *NULL* on failure. The
|
||||
operation is done *in-place* when *o1* supports it. This is the equivalent of
|
||||
the Python statement ``o1 -= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of multiplying *o1* and *o2*, or *NULL* on failure. The
|
||||
operation is done *in-place* when *o1* supports it. This is the equivalent of
|
||||
the Python statement ``o1 *= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on
|
||||
failure. The operation is done *in-place* when *o1* supports it. This is
|
||||
the equivalent of the Python statement ``o1 @= o2``.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the mathematical floor of dividing *o1* by *o2*, or *NULL* on failure.
|
||||
The operation is done *in-place* when *o1* supports it. This is the equivalent
|
||||
of the Python statement ``o1 //= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceTrueDivide(PyObject *o1, PyObject *o2)
|
||||
|
||||
Return a reasonable approximation for the mathematical value of *o1* divided by
|
||||
*o2*, or *NULL* on failure. The return value is "approximate" because binary
|
||||
floating point numbers are approximate; it is not possible to represent all real
|
||||
numbers in base two. This function can return a floating point value when
|
||||
passed two integers. The operation is done *in-place* when *o1* supports it.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the remainder of dividing *o1* by *o2*, or *NULL* on failure. The
|
||||
operation is done *in-place* when *o1* supports it. This is the equivalent of
|
||||
the Python statement ``o1 %= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlacePower(PyObject *o1, PyObject *o2, PyObject *o3)
|
||||
|
||||
.. index:: builtin: pow
|
||||
|
||||
See the built-in function :func:`pow`. Returns *NULL* on failure. The operation
|
||||
is done *in-place* when *o1* supports it. This is the equivalent of the Python
|
||||
statement ``o1 **= o2`` when o3 is :c:data:`Py_None`, or an in-place variant of
|
||||
``pow(o1, o2, o3)`` otherwise. If *o3* is to be ignored, pass :c:data:`Py_None`
|
||||
in its place (passing *NULL* for *o3* would cause an illegal memory access).
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of left shifting *o1* by *o2* on success, or *NULL* on
|
||||
failure. The operation is done *in-place* when *o1* supports it. This is the
|
||||
equivalent of the Python statement ``o1 <<= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the result of right shifting *o1* by *o2* on success, or *NULL* on
|
||||
failure. The operation is done *in-place* when *o1* supports it. This is the
|
||||
equivalent of the Python statement ``o1 >>= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise and" of *o1* and *o2* on success and *NULL* on failure. The
|
||||
operation is done *in-place* when *o1* supports it. This is the equivalent of
|
||||
the Python statement ``o1 &= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceXor(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise exclusive or" of *o1* by *o2* on success, or *NULL* on
|
||||
failure. The operation is done *in-place* when *o1* supports it. This is the
|
||||
equivalent of the Python statement ``o1 ^= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_InPlaceOr(PyObject *o1, PyObject *o2)
|
||||
|
||||
Returns the "bitwise or" of *o1* and *o2* on success, or *NULL* on failure. The
|
||||
operation is done *in-place* when *o1* supports it. This is the equivalent of
|
||||
the Python statement ``o1 |= o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Long(PyObject *o)
|
||||
|
||||
.. index:: builtin: int
|
||||
|
||||
Returns the *o* converted to an integer object on success, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``int(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Float(PyObject *o)
|
||||
|
||||
.. index:: builtin: float
|
||||
|
||||
Returns the *o* converted to a float object on success, or *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``float(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_Index(PyObject *o)
|
||||
|
||||
Returns the *o* converted to a Python int on success or *NULL* with a
|
||||
:exc:`TypeError` exception raised on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyNumber_ToBase(PyObject *n, int base)
|
||||
|
||||
Returns the integer *n* converted to base *base* as a string. The *base*
|
||||
argument must be one of 2, 8, 10, or 16. For base 2, 8, or 16, the
|
||||
returned string is prefixed with a base marker of ``'0b'``, ``'0o'``, or
|
||||
``'0x'``, respectively. If *n* is not a Python int, it is converted with
|
||||
:c:func:`PyNumber_Index` first.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc)
|
||||
|
||||
Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an
|
||||
integer. If the call fails, an exception is raised and ``-1`` is returned.
|
||||
|
||||
If *o* can be converted to a Python int but the attempt to
|
||||
convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the
|
||||
*exc* argument is the type of exception that will be raised (usually
|
||||
:exc:`IndexError` or :exc:`OverflowError`). If *exc* is *NULL*, then the
|
||||
exception is cleared and the value is clipped to *PY_SSIZE_T_MIN* for a negative
|
||||
integer or *PY_SSIZE_T_MAX* for a positive integer.
|
||||
|
||||
|
||||
.. c:function:: int PyIndex_Check(PyObject *o)
|
||||
|
||||
Returns ``1`` if *o* is an index integer (has the nb_index slot of the
|
||||
tp_as_number structure filled in), and ``0`` otherwise.
|
||||
This function always succeeds.
|
||||
55
python-3.7.4-docs-html/_sources/c-api/objbuffer.rst.txt
Normal file
55
python-3.7.4-docs-html/_sources/c-api/objbuffer.rst.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
Old Buffer Protocol
|
||||
-------------------
|
||||
|
||||
.. deprecated:: 3.0
|
||||
|
||||
These functions were part of the "old buffer protocol" API in Python 2.
|
||||
In Python 3, this protocol doesn't exist anymore but the functions are still
|
||||
exposed to ease porting 2.x code. They act as a compatibility wrapper
|
||||
around the :ref:`new buffer protocol <bufferobjects>`, but they don't give
|
||||
you control over the lifetime of the resources acquired when a buffer is
|
||||
exported.
|
||||
|
||||
Therefore, it is recommended that you call :c:func:`PyObject_GetBuffer`
|
||||
(or the ``y*`` or ``w*`` :ref:`format codes <arg-parsing>` with the
|
||||
:c:func:`PyArg_ParseTuple` family of functions) to get a buffer view over
|
||||
an object, and :c:func:`PyBuffer_Release` when the buffer view can be released.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_AsCharBuffer(PyObject *obj, const char **buffer, Py_ssize_t *buffer_len)
|
||||
|
||||
Returns a pointer to a read-only memory location usable as character-based
|
||||
input. The *obj* argument must support the single-segment character buffer
|
||||
interface. On success, returns ``0``, sets *buffer* to the memory location
|
||||
and *buffer_len* to the buffer length. Returns ``-1`` and sets a
|
||||
:exc:`TypeError` on error.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_AsReadBuffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
|
||||
|
||||
Returns a pointer to a read-only memory location containing arbitrary data.
|
||||
The *obj* argument must support the single-segment readable buffer
|
||||
interface. On success, returns ``0``, sets *buffer* to the memory location
|
||||
and *buffer_len* to the buffer length. Returns ``-1`` and sets a
|
||||
:exc:`TypeError` on error.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_CheckReadBuffer(PyObject *o)
|
||||
|
||||
Returns ``1`` if *o* supports the single-segment readable buffer interface.
|
||||
Otherwise returns ``0``. This function always succeeds.
|
||||
|
||||
Note that this function tries to get and release a buffer, and exceptions
|
||||
which occur while calling corresponding functions will get suppressed.
|
||||
To get error reporting use :c:func:`PyObject_GetBuffer()` instead.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_AsWriteBuffer(PyObject *obj, void **buffer, Py_ssize_t *buffer_len)
|
||||
|
||||
Returns a pointer to a writable memory location. The *obj* argument must
|
||||
support the single-segment, character buffer interface. On success,
|
||||
returns ``0``, sets *buffer* to the memory location and *buffer_len* to the
|
||||
buffer length. Returns ``-1`` and sets a :exc:`TypeError` on error.
|
||||
|
||||
451
python-3.7.4-docs-html/_sources/c-api/object.rst.txt
Normal file
451
python-3.7.4-docs-html/_sources/c-api/object.rst.txt
Normal file
@@ -0,0 +1,451 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _object:
|
||||
|
||||
Object Protocol
|
||||
===============
|
||||
|
||||
|
||||
.. c:var:: PyObject* Py_NotImplemented
|
||||
|
||||
The ``NotImplemented`` singleton, used to signal that an operation is
|
||||
not implemented for the given type combination.
|
||||
|
||||
|
||||
.. c:macro:: Py_RETURN_NOTIMPLEMENTED
|
||||
|
||||
Properly handle returning :c:data:`Py_NotImplemented` from within a C
|
||||
function (that is, increment the reference count of NotImplemented and
|
||||
return it).
|
||||
|
||||
|
||||
.. c:function:: int PyObject_Print(PyObject *o, FILE *fp, int flags)
|
||||
|
||||
Print an object *o*, on file *fp*. Returns ``-1`` on error. The flags argument
|
||||
is used to enable certain printing options. The only option currently supported
|
||||
is :const:`Py_PRINT_RAW`; if given, the :func:`str` of the object is written
|
||||
instead of the :func:`repr`.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_HasAttr(PyObject *o, PyObject *attr_name)
|
||||
|
||||
Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. This
|
||||
is equivalent to the Python expression ``hasattr(o, attr_name)``. This function
|
||||
always succeeds.
|
||||
|
||||
Note that exceptions which occur while calling :meth:`__getattr__` and
|
||||
:meth:`__getattribute__` methods will get suppressed.
|
||||
To get error reporting use :c:func:`PyObject_GetAttr()` instead.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_HasAttrString(PyObject *o, const char *attr_name)
|
||||
|
||||
Returns ``1`` if *o* has the attribute *attr_name*, and ``0`` otherwise. This
|
||||
is equivalent to the Python expression ``hasattr(o, attr_name)``. This function
|
||||
always succeeds.
|
||||
|
||||
Note that exceptions which occur while calling :meth:`__getattr__` and
|
||||
:meth:`__getattribute__` methods and creating a temporary string object
|
||||
will get suppressed.
|
||||
To get error reporting use :c:func:`PyObject_GetAttrString()` instead.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)
|
||||
|
||||
Retrieve an attribute named *attr_name* from object *o*. Returns the attribute
|
||||
value on success, or *NULL* on failure. This is the equivalent of the Python
|
||||
expression ``o.attr_name``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
|
||||
|
||||
Retrieve an attribute named *attr_name* from object *o*. Returns the attribute
|
||||
value on success, or *NULL* on failure. This is the equivalent of the Python
|
||||
expression ``o.attr_name``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GenericGetAttr(PyObject *o, PyObject *name)
|
||||
|
||||
Generic attribute getter function that is meant to be put into a type
|
||||
object's ``tp_getattro`` slot. It looks for a descriptor in the dictionary
|
||||
of classes in the object's MRO as well as an attribute in the object's
|
||||
:attr:`~object.__dict__` (if present). As outlined in :ref:`descriptors`,
|
||||
data descriptors take preference over instance attributes, while non-data
|
||||
descriptors don't. Otherwise, an :exc:`AttributeError` is raised.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)
|
||||
|
||||
Set the value of the attribute named *attr_name*, for object *o*, to the value
|
||||
*v*. Raise an exception and return ``-1`` on failure;
|
||||
return ``0`` on success. This is the equivalent of the Python statement
|
||||
``o.attr_name = v``.
|
||||
|
||||
If *v* is *NULL*, the attribute is deleted, however this feature is
|
||||
deprecated in favour of using :c:func:`PyObject_DelAttr`.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
|
||||
|
||||
Set the value of the attribute named *attr_name*, for object *o*, to the value
|
||||
*v*. Raise an exception and return ``-1`` on failure;
|
||||
return ``0`` on success. This is the equivalent of the Python statement
|
||||
``o.attr_name = v``.
|
||||
|
||||
If *v* is *NULL*, the attribute is deleted, however this feature is
|
||||
deprecated in favour of using :c:func:`PyObject_DelAttrString`.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)
|
||||
|
||||
Generic attribute setter and deleter function that is meant
|
||||
to be put into a type object's :c:member:`~PyTypeObject.tp_setattro`
|
||||
slot. It looks for a data descriptor in the
|
||||
dictionary of classes in the object's MRO, and if found it takes preference
|
||||
over setting or deleting the attribute in the instance dictionary. Otherwise, the
|
||||
attribute is set or deleted in the object's :attr:`~object.__dict__` (if present).
|
||||
On success, ``0`` is returned, otherwise an :exc:`AttributeError`
|
||||
is raised and ``-1`` is returned.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_DelAttr(PyObject *o, PyObject *attr_name)
|
||||
|
||||
Delete attribute named *attr_name*, for object *o*. Returns ``-1`` on failure.
|
||||
This is the equivalent of the Python statement ``del o.attr_name``.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_DelAttrString(PyObject *o, const char *attr_name)
|
||||
|
||||
Delete attribute named *attr_name*, for object *o*. Returns ``-1`` on failure.
|
||||
This is the equivalent of the Python statement ``del o.attr_name``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GenericGetDict(PyObject *o, void *context)
|
||||
|
||||
A generic implementation for the getter of a ``__dict__`` descriptor. It
|
||||
creates the dictionary if necessary.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: int PyObject_GenericSetDict(PyObject *o, void *context)
|
||||
|
||||
A generic implementation for the setter of a ``__dict__`` descriptor. This
|
||||
implementation does not allow the dictionary to be deleted.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)
|
||||
|
||||
Compare the values of *o1* and *o2* using the operation specified by *opid*,
|
||||
which must be one of :const:`Py_LT`, :const:`Py_LE`, :const:`Py_EQ`,
|
||||
:const:`Py_NE`, :const:`Py_GT`, or :const:`Py_GE`, corresponding to ``<``,
|
||||
``<=``, ``==``, ``!=``, ``>``, or ``>=`` respectively. This is the equivalent of
|
||||
the Python expression ``o1 op o2``, where ``op`` is the operator corresponding
|
||||
to *opid*. Returns the value of the comparison on success, or *NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)
|
||||
|
||||
Compare the values of *o1* and *o2* using the operation specified by *opid*,
|
||||
which must be one of :const:`Py_LT`, :const:`Py_LE`, :const:`Py_EQ`,
|
||||
:const:`Py_NE`, :const:`Py_GT`, or :const:`Py_GE`, corresponding to ``<``,
|
||||
``<=``, ``==``, ``!=``, ``>``, or ``>=`` respectively. Returns ``-1`` on error,
|
||||
``0`` if the result is false, ``1`` otherwise. This is the equivalent of the
|
||||
Python expression ``o1 op o2``, where ``op`` is the operator corresponding to
|
||||
*opid*.
|
||||
|
||||
.. note::
|
||||
If *o1* and *o2* are the same object, :c:func:`PyObject_RichCompareBool`
|
||||
will always return ``1`` for :const:`Py_EQ` and ``0`` for :const:`Py_NE`.
|
||||
|
||||
.. c:function:: PyObject* PyObject_Repr(PyObject *o)
|
||||
|
||||
.. index:: builtin: repr
|
||||
|
||||
Compute a string representation of object *o*. Returns the string
|
||||
representation on success, *NULL* on failure. This is the equivalent of the
|
||||
Python expression ``repr(o)``. Called by the :func:`repr` built-in function.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
This function now includes a debug assertion to help ensure that it
|
||||
does not silently discard an active exception.
|
||||
|
||||
.. c:function:: PyObject* PyObject_ASCII(PyObject *o)
|
||||
|
||||
.. index:: builtin: ascii
|
||||
|
||||
As :c:func:`PyObject_Repr`, compute a string representation of object *o*, but
|
||||
escape the non-ASCII characters in the string returned by
|
||||
:c:func:`PyObject_Repr` with ``\x``, ``\u`` or ``\U`` escapes. This generates
|
||||
a string similar to that returned by :c:func:`PyObject_Repr` in Python 2.
|
||||
Called by the :func:`ascii` built-in function.
|
||||
|
||||
.. index:: string; PyObject_Str (C function)
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_Str(PyObject *o)
|
||||
|
||||
Compute a string representation of object *o*. Returns the string
|
||||
representation on success, *NULL* on failure. This is the equivalent of the
|
||||
Python expression ``str(o)``. Called by the :func:`str` built-in function
|
||||
and, therefore, by the :func:`print` function.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
This function now includes a debug assertion to help ensure that it
|
||||
does not silently discard an active exception.
|
||||
|
||||
.. c:function:: PyObject* PyObject_Bytes(PyObject *o)
|
||||
|
||||
.. index:: builtin: bytes
|
||||
|
||||
Compute a bytes representation of object *o*. *NULL* is returned on
|
||||
failure and a bytes object on success. This is equivalent to the Python
|
||||
expression ``bytes(o)``, when *o* is not an integer. Unlike ``bytes(o)``,
|
||||
a TypeError is raised when *o* is an integer instead of a zero-initialized
|
||||
bytes object.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_IsSubclass(PyObject *derived, PyObject *cls)
|
||||
|
||||
Return ``1`` if the class *derived* is identical to or derived from the class
|
||||
*cls*, otherwise return ``0``. In case of an error, return ``-1``.
|
||||
|
||||
If *cls* is a tuple, the check will be done against every entry in *cls*.
|
||||
The result will be ``1`` when at least one of the checks returns ``1``,
|
||||
otherwise it will be ``0``.
|
||||
|
||||
If *cls* has a :meth:`~class.__subclasscheck__` method, it will be called to
|
||||
determine the subclass status as described in :pep:`3119`. Otherwise,
|
||||
*derived* is a subclass of *cls* if it is a direct or indirect subclass,
|
||||
i.e. contained in ``cls.__mro__``.
|
||||
|
||||
Normally only class objects, i.e. instances of :class:`type` or a derived
|
||||
class, are considered classes. However, objects can override this by having
|
||||
a :attr:`__bases__` attribute (which must be a tuple of base classes).
|
||||
|
||||
|
||||
.. c:function:: int PyObject_IsInstance(PyObject *inst, PyObject *cls)
|
||||
|
||||
Return ``1`` if *inst* is an instance of the class *cls* or a subclass of
|
||||
*cls*, or ``0`` if not. On error, returns ``-1`` and sets an exception.
|
||||
|
||||
If *cls* is a tuple, the check will be done against every entry in *cls*.
|
||||
The result will be ``1`` when at least one of the checks returns ``1``,
|
||||
otherwise it will be ``0``.
|
||||
|
||||
If *cls* has a :meth:`~class.__instancecheck__` method, it will be called to
|
||||
determine the subclass status as described in :pep:`3119`. Otherwise, *inst*
|
||||
is an instance of *cls* if its class is a subclass of *cls*.
|
||||
|
||||
An instance *inst* can override what is considered its class by having a
|
||||
:attr:`__class__` attribute.
|
||||
|
||||
An object *cls* can override if it is considered a class, and what its base
|
||||
classes are, by having a :attr:`__bases__` attribute (which must be a tuple
|
||||
of base classes).
|
||||
|
||||
|
||||
.. c:function:: int PyCallable_Check(PyObject *o)
|
||||
|
||||
Determine if the object *o* is callable. Return ``1`` if the object is callable
|
||||
and ``0`` otherwise. This function always succeeds.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
|
||||
|
||||
Call a callable Python object *callable*, with arguments given by the
|
||||
tuple *args*, and named arguments given by the dictionary *kwargs*.
|
||||
|
||||
*args* must not be *NULL*, use an empty tuple if no arguments are needed.
|
||||
If no named arguments are needed, *kwargs* can be *NULL*.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
This is the equivalent of the Python expression:
|
||||
``callable(*args, **kwargs)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args)
|
||||
|
||||
Call a callable Python object *callable*, with arguments given by the
|
||||
tuple *args*. If no arguments are needed, then *args* can be *NULL*.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
This is the equivalent of the Python expression: ``callable(*args)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)
|
||||
|
||||
Call a callable Python object *callable*, with a variable number of C arguments.
|
||||
The C arguments are described using a :c:func:`Py_BuildValue` style format
|
||||
string. The format can be *NULL*, indicating that no arguments are provided.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
This is the equivalent of the Python expression: ``callable(*args)``.
|
||||
|
||||
Note that if you only pass :c:type:`PyObject \*` args,
|
||||
:c:func:`PyObject_CallFunctionObjArgs` is a faster alternative.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
The type of *format* was changed from ``char *``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)
|
||||
|
||||
Call the method named *name* of object *obj* with a variable number of C
|
||||
arguments. The C arguments are described by a :c:func:`Py_BuildValue` format
|
||||
string that should produce a tuple.
|
||||
|
||||
The format can be *NULL*, indicating that no arguments are provided.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
This is the equivalent of the Python expression:
|
||||
``obj.name(arg1, arg2, ...)``.
|
||||
|
||||
Note that if you only pass :c:type:`PyObject \*` args,
|
||||
:c:func:`PyObject_CallMethodObjArgs` is a faster alternative.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
The types of *name* and *format* were changed from ``char *``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)
|
||||
|
||||
Call a callable Python object *callable*, with a variable number of
|
||||
:c:type:`PyObject\*` arguments. The arguments are provided as a variable number
|
||||
of parameters followed by *NULL*.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
This is the equivalent of the Python expression:
|
||||
``callable(arg1, arg2, ...)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ..., NULL)
|
||||
|
||||
Calls a method of the Python object *obj*, where the name of the method is given as a
|
||||
Python string object in *name*. It is called with a variable number of
|
||||
:c:type:`PyObject\*` arguments. The arguments are provided as a variable number
|
||||
of parameters followed by *NULL*.
|
||||
|
||||
Return the result of the call on success, or raise an exception and return
|
||||
*NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: Py_hash_t PyObject_Hash(PyObject *o)
|
||||
|
||||
.. index:: builtin: hash
|
||||
|
||||
Compute and return the hash value of an object *o*. On failure, return ``-1``.
|
||||
This is the equivalent of the Python expression ``hash(o)``.
|
||||
|
||||
.. versionchanged:: 3.2
|
||||
The return type is now Py_hash_t. This is a signed integer the same size
|
||||
as Py_ssize_t.
|
||||
|
||||
|
||||
.. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o)
|
||||
|
||||
Set a :exc:`TypeError` indicating that ``type(o)`` is not hashable and return ``-1``.
|
||||
This function receives special treatment when stored in a ``tp_hash`` slot,
|
||||
allowing a type to explicitly indicate to the interpreter that it is not
|
||||
hashable.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_IsTrue(PyObject *o)
|
||||
|
||||
Returns ``1`` if the object *o* is considered to be true, and ``0`` otherwise.
|
||||
This is equivalent to the Python expression ``not not o``. On failure, return
|
||||
``-1``.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_Not(PyObject *o)
|
||||
|
||||
Returns ``0`` if the object *o* is considered to be true, and ``1`` otherwise.
|
||||
This is equivalent to the Python expression ``not o``. On failure, return
|
||||
``-1``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_Type(PyObject *o)
|
||||
|
||||
.. index:: builtin: type
|
||||
|
||||
When *o* is non-*NULL*, returns a type object corresponding to the object type
|
||||
of object *o*. On failure, raises :exc:`SystemError` and returns *NULL*. This
|
||||
is equivalent to the Python expression ``type(o)``. This function increments the
|
||||
reference count of the return value. There's really no reason to use this
|
||||
function instead of the common expression ``o->ob_type``, which returns a
|
||||
pointer of type :c:type:`PyTypeObject\*`, except when the incremented reference
|
||||
count is needed.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)
|
||||
|
||||
Return true if the object *o* is of type *type* or a subtype of *type*. Both
|
||||
parameters must be non-*NULL*.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyObject_Size(PyObject *o)
|
||||
Py_ssize_t PyObject_Length(PyObject *o)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Return the length of object *o*. If the object *o* provides either the sequence
|
||||
and mapping protocols, the sequence length is returned. On error, ``-1`` is
|
||||
returned. This is the equivalent to the Python expression ``len(o)``.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyObject_LengthHint(PyObject *o, Py_ssize_t default)
|
||||
|
||||
Return an estimated length for the object *o*. First try to return its
|
||||
actual length, then an estimate using :meth:`~object.__length_hint__`, and
|
||||
finally return the default value. On error return ``-1``. This is the
|
||||
equivalent to the Python expression ``operator.length_hint(o, default)``.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GetItem(PyObject *o, PyObject *key)
|
||||
|
||||
Return element of *o* corresponding to the object *key* or *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``o[key]``.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)
|
||||
|
||||
Map the object *key* to the value *v*. Raise an exception and
|
||||
return ``-1`` on failure; return ``0`` on success. This is the
|
||||
equivalent of the Python statement ``o[key] = v``.
|
||||
|
||||
|
||||
.. c:function:: int PyObject_DelItem(PyObject *o, PyObject *key)
|
||||
|
||||
Remove the mapping for the object *key* from the object *o*. Return ``-1``
|
||||
on failure. This is equivalent to the Python statement ``del o[key]``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_Dir(PyObject *o)
|
||||
|
||||
This is equivalent to the Python expression ``dir(o)``, returning a (possibly
|
||||
empty) list of strings appropriate for the object argument, or *NULL* if there
|
||||
was an error. If the argument is *NULL*, this is like the Python ``dir()``,
|
||||
returning the names of the current locals; in this case, if no execution frame
|
||||
is active then *NULL* is returned but :c:func:`PyErr_Occurred` will return false.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyObject_GetIter(PyObject *o)
|
||||
|
||||
This is equivalent to the Python expression ``iter(o)``. It returns a new
|
||||
iterator for the object argument, or the object itself if the object is already
|
||||
an iterator. Raises :exc:`TypeError` and returns *NULL* if the object cannot be
|
||||
iterated.
|
||||
17
python-3.7.4-docs-html/_sources/c-api/objimpl.rst.txt
Normal file
17
python-3.7.4-docs-html/_sources/c-api/objimpl.rst.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _newtypes:
|
||||
|
||||
*****************************
|
||||
Object Implementation Support
|
||||
*****************************
|
||||
|
||||
This chapter describes the functions, types, and macros used when defining new
|
||||
object types.
|
||||
|
||||
.. toctree::
|
||||
|
||||
allocation.rst
|
||||
structures.rst
|
||||
typeobj.rst
|
||||
gcsupport.rst
|
||||
73
python-3.7.4-docs-html/_sources/c-api/refcounting.rst.txt
Normal file
73
python-3.7.4-docs-html/_sources/c-api/refcounting.rst.txt
Normal file
@@ -0,0 +1,73 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _countingrefs:
|
||||
|
||||
******************
|
||||
Reference Counting
|
||||
******************
|
||||
|
||||
The macros in this section are used for managing reference counts of Python
|
||||
objects.
|
||||
|
||||
|
||||
.. c:function:: void Py_INCREF(PyObject *o)
|
||||
|
||||
Increment the reference count for object *o*. The object must not be *NULL*; if
|
||||
you aren't sure that it isn't *NULL*, use :c:func:`Py_XINCREF`.
|
||||
|
||||
|
||||
.. c:function:: void Py_XINCREF(PyObject *o)
|
||||
|
||||
Increment the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect.
|
||||
|
||||
|
||||
.. c:function:: void Py_DECREF(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object must not be *NULL*; if
|
||||
you aren't sure that it isn't *NULL*, use :c:func:`Py_XDECREF`. If the reference
|
||||
count reaches zero, the object's type's deallocation function (which must not be
|
||||
*NULL*) is invoked.
|
||||
|
||||
.. warning::
|
||||
|
||||
The deallocation function can cause arbitrary Python code to be invoked (e.g.
|
||||
when a class instance with a :meth:`__del__` method is deallocated). While
|
||||
exceptions in such code are not propagated, the executed code has free access to
|
||||
all Python global variables. This means that any object that is reachable from
|
||||
a global variable should be in a consistent state before :c:func:`Py_DECREF` is
|
||||
invoked. For example, code to delete an object from a list should copy a
|
||||
reference to the deleted object in a temporary variable, update the list data
|
||||
structure, and then call :c:func:`Py_DECREF` for the temporary variable.
|
||||
|
||||
|
||||
.. c:function:: void Py_XDECREF(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect; otherwise the effect is the same as for
|
||||
:c:func:`Py_DECREF`, and the same warning applies.
|
||||
|
||||
|
||||
.. c:function:: void Py_CLEAR(PyObject *o)
|
||||
|
||||
Decrement the reference count for object *o*. The object may be *NULL*, in
|
||||
which case the macro has no effect; otherwise the effect is the same as for
|
||||
:c:func:`Py_DECREF`, except that the argument is also set to *NULL*. The warning
|
||||
for :c:func:`Py_DECREF` does not apply with respect to the object passed because
|
||||
the macro carefully uses a temporary variable and sets the argument to *NULL*
|
||||
before decrementing its reference count.
|
||||
|
||||
It is a good idea to use this macro whenever decrementing the value of a
|
||||
variable that might be traversed during garbage collection.
|
||||
|
||||
|
||||
The following functions are for runtime dynamic embedding of Python:
|
||||
``Py_IncRef(PyObject *o)``, ``Py_DecRef(PyObject *o)``. They are
|
||||
simply exported function versions of :c:func:`Py_XINCREF` and
|
||||
:c:func:`Py_XDECREF`, respectively.
|
||||
|
||||
The following functions or macros are only for use within the interpreter core:
|
||||
:c:func:`_Py_Dealloc`, :c:func:`_Py_ForgetReference`, :c:func:`_Py_NewReference`,
|
||||
as well as the global variable :c:data:`_Py_RefTotal`.
|
||||
|
||||
49
python-3.7.4-docs-html/_sources/c-api/reflection.rst.txt
Normal file
49
python-3.7.4-docs-html/_sources/c-api/reflection.rst.txt
Normal file
@@ -0,0 +1,49 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _reflection:
|
||||
|
||||
Reflection
|
||||
==========
|
||||
|
||||
.. c:function:: PyObject* PyEval_GetBuiltins()
|
||||
|
||||
Return a dictionary of the builtins in the current execution frame,
|
||||
or the interpreter of the thread state if no frame is currently executing.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyEval_GetLocals()
|
||||
|
||||
Return a dictionary of the local variables in the current execution frame,
|
||||
or *NULL* if no frame is currently executing.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyEval_GetGlobals()
|
||||
|
||||
Return a dictionary of the global variables in the current execution frame,
|
||||
or *NULL* if no frame is currently executing.
|
||||
|
||||
|
||||
.. c:function:: PyFrameObject* PyEval_GetFrame()
|
||||
|
||||
Return the current thread state's frame, which is *NULL* if no frame is
|
||||
currently executing.
|
||||
|
||||
|
||||
.. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame)
|
||||
|
||||
Return the line number that *frame* is currently executing.
|
||||
|
||||
|
||||
.. c:function:: const char* PyEval_GetFuncName(PyObject *func)
|
||||
|
||||
Return the name of *func* if it is a function, class or instance object, else the
|
||||
name of *func*\s type.
|
||||
|
||||
|
||||
.. c:function:: const char* PyEval_GetFuncDesc(PyObject *func)
|
||||
|
||||
Return a description string, depending on the type of *func*.
|
||||
Return values include "()" for functions and methods, " constructor",
|
||||
" instance", and " object". Concatenated with the result of
|
||||
:c:func:`PyEval_GetFuncName`, the result will be a description of
|
||||
*func*.
|
||||
169
python-3.7.4-docs-html/_sources/c-api/sequence.rst.txt
Normal file
169
python-3.7.4-docs-html/_sources/c-api/sequence.rst.txt
Normal file
@@ -0,0 +1,169 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _sequence:
|
||||
|
||||
Sequence Protocol
|
||||
=================
|
||||
|
||||
|
||||
.. c:function:: int PySequence_Check(PyObject *o)
|
||||
|
||||
Return ``1`` if the object provides sequence protocol, and ``0`` otherwise.
|
||||
Note that it returns ``1`` for Python classes with a :meth:`__getitem__`
|
||||
method unless they are :class:`dict` subclasses since in general case it
|
||||
is impossible to determine what the type of keys it supports. This
|
||||
function always succeeds.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySequence_Size(PyObject *o)
|
||||
Py_ssize_t PySequence_Length(PyObject *o)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Returns the number of objects in sequence *o* on success, and ``-1`` on
|
||||
failure. This is equivalent to the Python expression ``len(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_Concat(PyObject *o1, PyObject *o2)
|
||||
|
||||
Return the concatenation of *o1* and *o2* on success, and *NULL* on failure.
|
||||
This is the equivalent of the Python expression ``o1 + o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_Repeat(PyObject *o, Py_ssize_t count)
|
||||
|
||||
Return the result of repeating sequence object *o* *count* times, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o * count``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_InPlaceConcat(PyObject *o1, PyObject *o2)
|
||||
|
||||
Return the concatenation of *o1* and *o2* on success, and *NULL* on failure.
|
||||
The operation is done *in-place* when *o1* supports it. This is the equivalent
|
||||
of the Python expression ``o1 += o2``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
|
||||
|
||||
Return the result of repeating sequence object *o* *count* times, or *NULL* on
|
||||
failure. The operation is done *in-place* when *o* supports it. This is the
|
||||
equivalent of the Python expression ``o *= count``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_GetItem(PyObject *o, Py_ssize_t i)
|
||||
|
||||
Return the *i*\ th element of *o*, or *NULL* on failure. This is the equivalent of
|
||||
the Python expression ``o[i]``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
|
||||
|
||||
Return the slice of sequence object *o* between *i1* and *i2*, or *NULL* on
|
||||
failure. This is the equivalent of the Python expression ``o[i1:i2]``.
|
||||
|
||||
|
||||
.. c:function:: int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)
|
||||
|
||||
Assign object *v* to the *i*\ th element of *o*. Raise an exception
|
||||
and return ``-1`` on failure; return ``0`` on success. This
|
||||
is the equivalent of the Python statement ``o[i] = v``. This function *does
|
||||
not* steal a reference to *v*.
|
||||
|
||||
If *v* is *NULL*, the element is deleted, however this feature is
|
||||
deprecated in favour of using :c:func:`PySequence_DelItem`.
|
||||
|
||||
|
||||
.. c:function:: int PySequence_DelItem(PyObject *o, Py_ssize_t i)
|
||||
|
||||
Delete the *i*\ th element of object *o*. Returns ``-1`` on failure. This is the
|
||||
equivalent of the Python statement ``del o[i]``.
|
||||
|
||||
|
||||
.. c:function:: int PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
|
||||
|
||||
Assign the sequence object *v* to the slice in sequence object *o* from *i1* to
|
||||
*i2*. This is the equivalent of the Python statement ``o[i1:i2] = v``.
|
||||
|
||||
|
||||
.. c:function:: int PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
|
||||
|
||||
Delete the slice in sequence object *o* from *i1* to *i2*. Returns ``-1`` on
|
||||
failure. This is the equivalent of the Python statement ``del o[i1:i2]``.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySequence_Count(PyObject *o, PyObject *value)
|
||||
|
||||
Return the number of occurrences of *value* in *o*, that is, return the number
|
||||
of keys for which ``o[key] == value``. On failure, return ``-1``. This is
|
||||
equivalent to the Python expression ``o.count(value)``.
|
||||
|
||||
|
||||
.. c:function:: int PySequence_Contains(PyObject *o, PyObject *value)
|
||||
|
||||
Determine if *o* contains *value*. If an item in *o* is equal to *value*,
|
||||
return ``1``, otherwise return ``0``. On error, return ``-1``. This is
|
||||
equivalent to the Python expression ``value in o``.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySequence_Index(PyObject *o, PyObject *value)
|
||||
|
||||
Return the first index *i* for which ``o[i] == value``. On error, return
|
||||
``-1``. This is equivalent to the Python expression ``o.index(value)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_List(PyObject *o)
|
||||
|
||||
Return a list object with the same contents as the sequence or iterable *o*,
|
||||
or *NULL* on failure. The returned list is guaranteed to be new. This is
|
||||
equivalent to the Python expression ``list(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_Tuple(PyObject *o)
|
||||
|
||||
.. index:: builtin: tuple
|
||||
|
||||
Return a tuple object with the same contents as the sequence or iterable *o*,
|
||||
or *NULL* on failure. If *o* is a tuple, a new reference will be returned,
|
||||
otherwise a tuple will be constructed with the appropriate contents. This is
|
||||
equivalent to the Python expression ``tuple(o)``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_Fast(PyObject *o, const char *m)
|
||||
|
||||
Return the sequence or iterable *o* as a list, unless it is already a tuple or list, in
|
||||
which case *o* is returned. Use :c:func:`PySequence_Fast_GET_ITEM` to access
|
||||
the members of the result. Returns *NULL* on failure. If the object is not
|
||||
a sequence or iterable, raises :exc:`TypeError` with *m* as the message text.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySequence_Fast_GET_SIZE(PyObject *o)
|
||||
|
||||
Returns the length of *o*, assuming that *o* was returned by
|
||||
:c:func:`PySequence_Fast` and that *o* is not *NULL*. The size can also be
|
||||
gotten by calling :c:func:`PySequence_Size` on *o*, but
|
||||
:c:func:`PySequence_Fast_GET_SIZE` is faster because it can assume *o* is a list
|
||||
or tuple.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i)
|
||||
|
||||
Return the *i*\ th element of *o*, assuming that *o* was returned by
|
||||
:c:func:`PySequence_Fast`, *o* is not *NULL*, and that *i* is within bounds.
|
||||
|
||||
|
||||
.. c:function:: PyObject** PySequence_Fast_ITEMS(PyObject *o)
|
||||
|
||||
Return the underlying array of PyObject pointers. Assumes that *o* was returned
|
||||
by :c:func:`PySequence_Fast` and *o* is not *NULL*.
|
||||
|
||||
Note, if a list gets resized, the reallocation may relocate the items array.
|
||||
So, only use the underlying array pointer in contexts where the sequence
|
||||
cannot change.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySequence_ITEM(PyObject *o, Py_ssize_t i)
|
||||
|
||||
Return the *i*\ th element of *o* or *NULL* on failure. Macro form of
|
||||
:c:func:`PySequence_GetItem` but without checking that
|
||||
:c:func:`PySequence_Check` on *o* is true and without adjustment for negative
|
||||
indices.
|
||||
166
python-3.7.4-docs-html/_sources/c-api/set.rst.txt
Normal file
166
python-3.7.4-docs-html/_sources/c-api/set.rst.txt
Normal file
@@ -0,0 +1,166 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _setobjects:
|
||||
|
||||
Set Objects
|
||||
-----------
|
||||
|
||||
.. sectionauthor:: Raymond D. Hettinger <python@rcn.com>
|
||||
|
||||
|
||||
.. index::
|
||||
object: set
|
||||
object: frozenset
|
||||
|
||||
This section details the public API for :class:`set` and :class:`frozenset`
|
||||
objects. Any functionality not listed below is best accessed using the either
|
||||
the abstract object protocol (including :c:func:`PyObject_CallMethod`,
|
||||
:c:func:`PyObject_RichCompareBool`, :c:func:`PyObject_Hash`,
|
||||
:c:func:`PyObject_Repr`, :c:func:`PyObject_IsTrue`, :c:func:`PyObject_Print`, and
|
||||
:c:func:`PyObject_GetIter`) or the abstract number protocol (including
|
||||
:c:func:`PyNumber_And`, :c:func:`PyNumber_Subtract`, :c:func:`PyNumber_Or`,
|
||||
:c:func:`PyNumber_Xor`, :c:func:`PyNumber_InPlaceAnd`,
|
||||
:c:func:`PyNumber_InPlaceSubtract`, :c:func:`PyNumber_InPlaceOr`, and
|
||||
:c:func:`PyNumber_InPlaceXor`).
|
||||
|
||||
|
||||
.. c:type:: PySetObject
|
||||
|
||||
This subtype of :c:type:`PyObject` is used to hold the internal data for both
|
||||
:class:`set` and :class:`frozenset` objects. It is like a :c:type:`PyDictObject`
|
||||
in that it is a fixed size for small sets (much like tuple storage) and will
|
||||
point to a separate, variable sized block of memory for medium and large sized
|
||||
sets (much like list storage). None of the fields of this structure should be
|
||||
considered public and are subject to change. All access should be done through
|
||||
the documented API rather than by manipulating the values in the structure.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PySet_Type
|
||||
|
||||
This is an instance of :c:type:`PyTypeObject` representing the Python
|
||||
:class:`set` type.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyFrozenSet_Type
|
||||
|
||||
This is an instance of :c:type:`PyTypeObject` representing the Python
|
||||
:class:`frozenset` type.
|
||||
|
||||
The following type check macros work on pointers to any Python object. Likewise,
|
||||
the constructor functions work with any iterable Python object.
|
||||
|
||||
|
||||
.. c:function:: int PySet_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a :class:`set` object or an instance of a subtype.
|
||||
|
||||
.. c:function:: int PyFrozenSet_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a :class:`frozenset` object or an instance of a
|
||||
subtype.
|
||||
|
||||
.. c:function:: int PyAnySet_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an
|
||||
instance of a subtype.
|
||||
|
||||
|
||||
.. c:function:: int PyAnySet_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a :class:`set` object or a :class:`frozenset` object but
|
||||
not an instance of a subtype.
|
||||
|
||||
|
||||
.. c:function:: int PyFrozenSet_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a :class:`frozenset` object but not an instance of a
|
||||
subtype.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySet_New(PyObject *iterable)
|
||||
|
||||
Return a new :class:`set` containing objects returned by the *iterable*. The
|
||||
*iterable* may be *NULL* to create a new empty set. Return the new set on
|
||||
success or *NULL* on failure. Raise :exc:`TypeError` if *iterable* is not
|
||||
actually iterable. The constructor is also useful for copying a set
|
||||
(``c=set(s)``).
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyFrozenSet_New(PyObject *iterable)
|
||||
|
||||
Return a new :class:`frozenset` containing objects returned by the *iterable*.
|
||||
The *iterable* may be *NULL* to create a new empty frozenset. Return the new
|
||||
set on success or *NULL* on failure. Raise :exc:`TypeError` if *iterable* is
|
||||
not actually iterable.
|
||||
|
||||
|
||||
The following functions and macros are available for instances of :class:`set`
|
||||
or :class:`frozenset` or instances of their subtypes.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySet_Size(PyObject *anyset)
|
||||
|
||||
.. index:: builtin: len
|
||||
|
||||
Return the length of a :class:`set` or :class:`frozenset` object. Equivalent to
|
||||
``len(anyset)``. Raises a :exc:`PyExc_SystemError` if *anyset* is not a
|
||||
:class:`set`, :class:`frozenset`, or an instance of a subtype.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
|
||||
|
||||
Macro form of :c:func:`PySet_Size` without error checking.
|
||||
|
||||
|
||||
.. c:function:: int PySet_Contains(PyObject *anyset, PyObject *key)
|
||||
|
||||
Return ``1`` if found, ``0`` if not found, and ``-1`` if an error is encountered. Unlike
|
||||
the Python :meth:`__contains__` method, this function does not automatically
|
||||
convert unhashable sets into temporary frozensets. Raise a :exc:`TypeError` if
|
||||
the *key* is unhashable. Raise :exc:`PyExc_SystemError` if *anyset* is not a
|
||||
:class:`set`, :class:`frozenset`, or an instance of a subtype.
|
||||
|
||||
|
||||
.. c:function:: int PySet_Add(PyObject *set, PyObject *key)
|
||||
|
||||
Add *key* to a :class:`set` instance. Also works with :class:`frozenset`
|
||||
instances (like :c:func:`PyTuple_SetItem` it can be used to fill-in the values
|
||||
of brand new frozensets before they are exposed to other code). Return ``0`` on
|
||||
success or ``-1`` on failure. Raise a :exc:`TypeError` if the *key* is
|
||||
unhashable. Raise a :exc:`MemoryError` if there is no room to grow. Raise a
|
||||
:exc:`SystemError` if *set* is not an instance of :class:`set` or its
|
||||
subtype.
|
||||
|
||||
|
||||
The following functions are available for instances of :class:`set` or its
|
||||
subtypes but not for instances of :class:`frozenset` or its subtypes.
|
||||
|
||||
|
||||
.. c:function:: int PySet_Discard(PyObject *set, PyObject *key)
|
||||
|
||||
Return ``1`` if found and removed, ``0`` if not found (no action taken), and ``-1`` if an
|
||||
error is encountered. Does not raise :exc:`KeyError` for missing keys. Raise a
|
||||
:exc:`TypeError` if the *key* is unhashable. Unlike the Python :meth:`~set.discard`
|
||||
method, this function does not automatically convert unhashable sets into
|
||||
temporary frozensets. Raise :exc:`PyExc_SystemError` if *set* is not an
|
||||
instance of :class:`set` or its subtype.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySet_Pop(PyObject *set)
|
||||
|
||||
Return a new reference to an arbitrary object in the *set*, and removes the
|
||||
object from the *set*. Return *NULL* on failure. Raise :exc:`KeyError` if the
|
||||
set is empty. Raise a :exc:`SystemError` if *set* is not an instance of
|
||||
:class:`set` or its subtype.
|
||||
|
||||
|
||||
.. c:function:: int PySet_Clear(PyObject *set)
|
||||
|
||||
Empty an existing set of all elements.
|
||||
|
||||
|
||||
.. c:function:: int PySet_ClearFreeList()
|
||||
|
||||
Clear the free list. Return the total number of freed items.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
122
python-3.7.4-docs-html/_sources/c-api/slice.rst.txt
Normal file
122
python-3.7.4-docs-html/_sources/c-api/slice.rst.txt
Normal file
@@ -0,0 +1,122 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _slice-objects:
|
||||
|
||||
Slice Objects
|
||||
-------------
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PySlice_Type
|
||||
|
||||
The type object for slice objects. This is the same as :class:`slice` in the
|
||||
Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PySlice_Check(PyObject *ob)
|
||||
|
||||
Return true if *ob* is a slice object; *ob* must not be *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
|
||||
|
||||
Return a new slice object with the given values. The *start*, *stop*, and
|
||||
*step* parameters are used as the values of the slice object attributes of
|
||||
the same names. Any of the values may be *NULL*, in which case the
|
||||
``None`` will be used for the corresponding attribute. Return *NULL* if
|
||||
the new object could not be allocated.
|
||||
|
||||
|
||||
.. c:function:: int PySlice_GetIndices(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
|
||||
|
||||
Retrieve the start, stop and step indices from the slice object *slice*,
|
||||
assuming a sequence of length *length*. Treats indices greater than
|
||||
*length* as errors.
|
||||
|
||||
Returns ``0`` on success and ``-1`` on error with no exception set (unless one of
|
||||
the indices was not :const:`None` and failed to be converted to an integer,
|
||||
in which case ``-1`` is returned with an exception set).
|
||||
|
||||
You probably do not want to use this function.
|
||||
|
||||
.. versionchanged:: 3.2
|
||||
The parameter type for the *slice* parameter was ``PySliceObject*``
|
||||
before.
|
||||
|
||||
|
||||
.. c:function:: int PySlice_GetIndicesEx(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
|
||||
|
||||
Usable replacement for :c:func:`PySlice_GetIndices`. Retrieve the start,
|
||||
stop, and step indices from the slice object *slice* assuming a sequence of
|
||||
length *length*, and store the length of the slice in *slicelength*. Out
|
||||
of bounds indices are clipped in a manner consistent with the handling of
|
||||
normal slices.
|
||||
|
||||
Returns ``0`` on success and ``-1`` on error with exception set.
|
||||
|
||||
.. note::
|
||||
This function is considered not safe for resizable sequences.
|
||||
Its invocation should be replaced by a combination of
|
||||
:c:func:`PySlice_Unpack` and :c:func:`PySlice_AdjustIndices` where ::
|
||||
|
||||
if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {
|
||||
// return error
|
||||
}
|
||||
|
||||
is replaced by ::
|
||||
|
||||
if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {
|
||||
// return error
|
||||
}
|
||||
slicelength = PySlice_AdjustIndices(length, &start, &stop, step);
|
||||
|
||||
.. versionchanged:: 3.2
|
||||
The parameter type for the *slice* parameter was ``PySliceObject*``
|
||||
before.
|
||||
|
||||
.. versionchanged:: 3.6.1
|
||||
If ``Py_LIMITED_API`` is not set or set to the value between ``0x03050400``
|
||||
and ``0x03060000`` (not including) or ``0x03060100`` or higher
|
||||
:c:func:`!PySlice_GetIndicesEx` is implemented as a macro using
|
||||
:c:func:`!PySlice_Unpack` and :c:func:`!PySlice_AdjustIndices`.
|
||||
Arguments *start*, *stop* and *step* are evaluated more than once.
|
||||
|
||||
.. deprecated:: 3.6.1
|
||||
If ``Py_LIMITED_API`` is set to the value less than ``0x03050400`` or
|
||||
between ``0x03060000`` and ``0x03060100`` (not including)
|
||||
:c:func:`!PySlice_GetIndicesEx` is a deprecated function.
|
||||
|
||||
|
||||
.. c:function:: int PySlice_Unpack(PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
|
||||
|
||||
Extract the start, stop and step data members from a slice object as
|
||||
C integers. Silently reduce values larger than ``PY_SSIZE_T_MAX`` to
|
||||
``PY_SSIZE_T_MAX``, silently boost the start and stop values less than
|
||||
``PY_SSIZE_T_MIN`` to ``PY_SSIZE_T_MIN``, and silently boost the step
|
||||
values less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``.
|
||||
|
||||
Return ``-1`` on error, ``0`` on success.
|
||||
|
||||
.. versionadded:: 3.6.1
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
|
||||
|
||||
Adjust start/end slice indices assuming a sequence of the specified length.
|
||||
Out of bounds indices are clipped in a manner consistent with the handling
|
||||
of normal slices.
|
||||
|
||||
Return the length of the slice. Always successful. Doesn't call Python
|
||||
code.
|
||||
|
||||
.. versionadded:: 3.6.1
|
||||
|
||||
|
||||
Ellipsis Object
|
||||
---------------
|
||||
|
||||
|
||||
.. c:var:: PyObject *Py_Ellipsis
|
||||
|
||||
The Python ``Ellipsis`` object. This object has no methods. It needs to be
|
||||
treated just like any other object with respect to reference counts. Like
|
||||
:c:data:`Py_None` it is a singleton object.
|
||||
38
python-3.7.4-docs-html/_sources/c-api/stable.rst.txt
Normal file
38
python-3.7.4-docs-html/_sources/c-api/stable.rst.txt
Normal file
@@ -0,0 +1,38 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _stable:
|
||||
|
||||
***********************************
|
||||
Stable Application Binary Interface
|
||||
***********************************
|
||||
|
||||
Traditionally, the C API of Python will change with every release. Most changes
|
||||
will be source-compatible, typically by only adding API, rather than changing
|
||||
existing API or removing API (although some interfaces do get removed after
|
||||
being deprecated first).
|
||||
|
||||
Unfortunately, the API compatibility does not extend to binary compatibility
|
||||
(the ABI). The reason is primarily the evolution of struct definitions, where
|
||||
addition of a new field, or changing the type of a field, might not break the
|
||||
API, but can break the ABI. As a consequence, extension modules need to be
|
||||
recompiled for every Python release (although an exception is possible on Unix
|
||||
when none of the affected interfaces are used). In addition, on Windows,
|
||||
extension modules link with a specific pythonXY.dll and need to be recompiled to
|
||||
link with a newer one.
|
||||
|
||||
Since Python 3.2, a subset of the API has been declared to guarantee a stable
|
||||
ABI. Extension modules wishing to use this API (called "limited API") need to
|
||||
define ``Py_LIMITED_API``. A number of interpreter details then become hidden
|
||||
from the extension module; in return, a module is built that works on any 3.x
|
||||
version (x>=2) without recompilation.
|
||||
|
||||
In some cases, the stable ABI needs to be extended with new functions.
|
||||
Extension modules wishing to use these new APIs need to set ``Py_LIMITED_API``
|
||||
to the ``PY_VERSION_HEX`` value (see :ref:`apiabiversion`) of the minimum Python
|
||||
version they want to support (e.g. ``0x03030000`` for Python 3.3). Such modules
|
||||
will work on all subsequent Python releases, but fail to load (because of
|
||||
missing symbols) on the older releases.
|
||||
|
||||
As of Python 3.2, the set of functions available to the limited API is
|
||||
documented in :pep:`384`. In the C API documentation, API elements that are not
|
||||
part of the limited API are marked as "Not part of the limited API."
|
||||
376
python-3.7.4-docs-html/_sources/c-api/structures.rst.txt
Normal file
376
python-3.7.4-docs-html/_sources/c-api/structures.rst.txt
Normal file
@@ -0,0 +1,376 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _common-structs:
|
||||
|
||||
Common Object Structures
|
||||
========================
|
||||
|
||||
There are a large number of structures which are used in the definition of
|
||||
object types for Python. This section describes these structures and how they
|
||||
are used.
|
||||
|
||||
All Python objects ultimately share a small number of fields at the beginning
|
||||
of the object's representation in memory. These are represented by the
|
||||
:c:type:`PyObject` and :c:type:`PyVarObject` types, which are defined, in turn,
|
||||
by the expansions of some macros also used, whether directly or indirectly, in
|
||||
the definition of all other Python objects.
|
||||
|
||||
|
||||
.. c:type:: PyObject
|
||||
|
||||
All object types are extensions of this type. This is a type which
|
||||
contains the information Python needs to treat a pointer to an object as an
|
||||
object. In a normal "release" build, it contains only the object's
|
||||
reference count and a pointer to the corresponding type object.
|
||||
Nothing is actually declared to be a :c:type:`PyObject`, but every pointer
|
||||
to a Python object can be cast to a :c:type:`PyObject*`. Access to the
|
||||
members must be done by using the macros :c:macro:`Py_REFCNT` and
|
||||
:c:macro:`Py_TYPE`.
|
||||
|
||||
|
||||
.. c:type:: PyVarObject
|
||||
|
||||
This is an extension of :c:type:`PyObject` that adds the :attr:`ob_size`
|
||||
field. This is only used for objects that have some notion of *length*.
|
||||
This type does not often appear in the Python/C API.
|
||||
Access to the members must be done by using the macros
|
||||
:c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`.
|
||||
|
||||
|
||||
.. c:macro:: PyObject_HEAD
|
||||
|
||||
This is a macro used when declaring new types which represent objects
|
||||
without a varying length. The PyObject_HEAD macro expands to::
|
||||
|
||||
PyObject ob_base;
|
||||
|
||||
See documentation of :c:type:`PyObject` above.
|
||||
|
||||
|
||||
.. c:macro:: PyObject_VAR_HEAD
|
||||
|
||||
This is a macro used when declaring new types which represent objects
|
||||
with a length that varies from instance to instance.
|
||||
The PyObject_VAR_HEAD macro expands to::
|
||||
|
||||
PyVarObject ob_base;
|
||||
|
||||
See documentation of :c:type:`PyVarObject` above.
|
||||
|
||||
|
||||
.. c:macro:: Py_TYPE(o)
|
||||
|
||||
This macro is used to access the :attr:`ob_type` member of a Python object.
|
||||
It expands to::
|
||||
|
||||
(((PyObject*)(o))->ob_type)
|
||||
|
||||
|
||||
.. c:macro:: Py_REFCNT(o)
|
||||
|
||||
This macro is used to access the :attr:`ob_refcnt` member of a Python
|
||||
object.
|
||||
It expands to::
|
||||
|
||||
(((PyObject*)(o))->ob_refcnt)
|
||||
|
||||
|
||||
.. c:macro:: Py_SIZE(o)
|
||||
|
||||
This macro is used to access the :attr:`ob_size` member of a Python object.
|
||||
It expands to::
|
||||
|
||||
(((PyVarObject*)(o))->ob_size)
|
||||
|
||||
|
||||
.. c:macro:: PyObject_HEAD_INIT(type)
|
||||
|
||||
This is a macro which expands to initialization values for a new
|
||||
:c:type:`PyObject` type. This macro expands to::
|
||||
|
||||
_PyObject_EXTRA_INIT
|
||||
1, type,
|
||||
|
||||
|
||||
.. c:macro:: PyVarObject_HEAD_INIT(type, size)
|
||||
|
||||
This is a macro which expands to initialization values for a new
|
||||
:c:type:`PyVarObject` type, including the :attr:`ob_size` field.
|
||||
This macro expands to::
|
||||
|
||||
_PyObject_EXTRA_INIT
|
||||
1, type, size,
|
||||
|
||||
|
||||
.. c:type:: PyCFunction
|
||||
|
||||
Type of the functions used to implement most Python callables in C.
|
||||
Functions of this type take two :c:type:`PyObject\*` parameters and return
|
||||
one such value. If the return value is *NULL*, an exception shall have
|
||||
been set. If not *NULL*, the return value is interpreted as the return
|
||||
value of the function as exposed in Python. The function must return a new
|
||||
reference.
|
||||
|
||||
|
||||
.. c:type:: PyCFunctionWithKeywords
|
||||
|
||||
Type of the functions used to implement Python callables in C
|
||||
with signature :const:`METH_VARARGS | METH_KEYWORDS`.
|
||||
|
||||
|
||||
.. c:type:: _PyCFunctionFast
|
||||
|
||||
Type of the functions used to implement Python callables in C
|
||||
with signature :const:`METH_FASTCALL`.
|
||||
|
||||
|
||||
.. c:type:: _PyCFunctionFastWithKeywords
|
||||
|
||||
Type of the functions used to implement Python callables in C
|
||||
with signature :const:`METH_FASTCALL | METH_KEYWORDS`.
|
||||
|
||||
|
||||
.. c:type:: PyMethodDef
|
||||
|
||||
Structure used to describe a method of an extension type. This structure has
|
||||
four fields:
|
||||
|
||||
+------------------+---------------+-------------------------------+
|
||||
| Field | C Type | Meaning |
|
||||
+==================+===============+===============================+
|
||||
| :attr:`ml_name` | const char \* | name of the method |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`ml_meth` | PyCFunction | pointer to the C |
|
||||
| | | implementation |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`ml_flags` | int | flag bits indicating how the |
|
||||
| | | call should be constructed |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`ml_doc` | const char \* | points to the contents of the |
|
||||
| | | docstring |
|
||||
+------------------+---------------+-------------------------------+
|
||||
|
||||
The :attr:`ml_meth` is a C function pointer. The functions may be of different
|
||||
types, but they always return :c:type:`PyObject\*`. If the function is not of
|
||||
the :c:type:`PyCFunction`, the compiler will require a cast in the method table.
|
||||
Even though :c:type:`PyCFunction` defines the first parameter as
|
||||
:c:type:`PyObject\*`, it is common that the method implementation uses the
|
||||
specific C type of the *self* object.
|
||||
|
||||
The :attr:`ml_flags` field is a bitfield which can include the following flags.
|
||||
The individual flags indicate either a calling convention or a binding
|
||||
convention.
|
||||
|
||||
There are four basic calling conventions for positional arguments
|
||||
and two of them can be combined with :const:`METH_KEYWORDS` to support
|
||||
also keyword arguments. So there are a total of 6 calling conventions:
|
||||
|
||||
.. data:: METH_VARARGS
|
||||
|
||||
This is the typical calling convention, where the methods have the type
|
||||
:c:type:`PyCFunction`. The function expects two :c:type:`PyObject\*` values.
|
||||
The first one is the *self* object for methods; for module functions, it is
|
||||
the module object. The second parameter (often called *args*) is a tuple
|
||||
object representing all arguments. This parameter is typically processed
|
||||
using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`.
|
||||
|
||||
|
||||
.. data:: METH_VARARGS | METH_KEYWORDS
|
||||
|
||||
Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`.
|
||||
The function expects three parameters: *self*, *args*, *kwargs* where
|
||||
*kwargs* is a dictionary of all the keyword arguments or possibly *NULL*
|
||||
if there are no keyword arguments. The parameters are typically processed
|
||||
using :c:func:`PyArg_ParseTupleAndKeywords`.
|
||||
|
||||
|
||||
.. data:: METH_FASTCALL
|
||||
|
||||
Fast calling convention supporting only positional arguments.
|
||||
The methods have the type :c:type:`_PyCFunctionFast`.
|
||||
The first parameter is *self*, the second parameter is a C array
|
||||
of :c:type:`PyObject\*` values indicating the arguments and the third
|
||||
parameter is the number of arguments (the length of the array).
|
||||
|
||||
This is not part of the :ref:`limited API <stable>`.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. data:: METH_FASTCALL | METH_KEYWORDS
|
||||
|
||||
Extension of :const:`METH_FASTCALL` supporting also keyword arguments,
|
||||
with methods of type :c:type:`_PyCFunctionFastWithKeywords`.
|
||||
Keyword arguments are passed the same way as in the vectorcall protocol:
|
||||
there is an additional fourth :c:type:`PyObject\*` parameter
|
||||
which is a tuple representing the names of the keyword arguments
|
||||
or possibly *NULL* if there are no keywords. The values of the keyword
|
||||
arguments are stored in the *args* array, after the positional arguments.
|
||||
|
||||
This is not part of the :ref:`limited API <stable>`.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. data:: METH_NOARGS
|
||||
|
||||
Methods without parameters don't need to check whether arguments are given if
|
||||
they are listed with the :const:`METH_NOARGS` flag. They need to be of type
|
||||
:c:type:`PyCFunction`. The first parameter is typically named *self* and will
|
||||
hold a reference to the module or object instance. In all cases the second
|
||||
parameter will be *NULL*.
|
||||
|
||||
|
||||
.. data:: METH_O
|
||||
|
||||
Methods with a single object argument can be listed with the :const:`METH_O`
|
||||
flag, instead of invoking :c:func:`PyArg_ParseTuple` with a ``"O"`` argument.
|
||||
They have the type :c:type:`PyCFunction`, with the *self* parameter, and a
|
||||
:c:type:`PyObject\*` parameter representing the single argument.
|
||||
|
||||
|
||||
These two constants are not used to indicate the calling convention but the
|
||||
binding when use with methods of classes. These may not be used for functions
|
||||
defined for modules. At most one of these flags may be set for any given
|
||||
method.
|
||||
|
||||
|
||||
.. data:: METH_CLASS
|
||||
|
||||
.. index:: builtin: classmethod
|
||||
|
||||
The method will be passed the type object as the first parameter rather
|
||||
than an instance of the type. This is used to create *class methods*,
|
||||
similar to what is created when using the :func:`classmethod` built-in
|
||||
function.
|
||||
|
||||
|
||||
.. data:: METH_STATIC
|
||||
|
||||
.. index:: builtin: staticmethod
|
||||
|
||||
The method will be passed *NULL* as the first parameter rather than an
|
||||
instance of the type. This is used to create *static methods*, similar to
|
||||
what is created when using the :func:`staticmethod` built-in function.
|
||||
|
||||
One other constant controls whether a method is loaded in place of another
|
||||
definition with the same method name.
|
||||
|
||||
|
||||
.. data:: METH_COEXIST
|
||||
|
||||
The method will be loaded in place of existing definitions. Without
|
||||
*METH_COEXIST*, the default is to skip repeated definitions. Since slot
|
||||
wrappers are loaded before the method table, the existence of a
|
||||
*sq_contains* slot, for example, would generate a wrapped method named
|
||||
:meth:`__contains__` and preclude the loading of a corresponding
|
||||
PyCFunction with the same name. With the flag defined, the PyCFunction
|
||||
will be loaded in place of the wrapper object and will co-exist with the
|
||||
slot. This is helpful because calls to PyCFunctions are optimized more
|
||||
than wrapper object calls.
|
||||
|
||||
|
||||
.. c:type:: PyMemberDef
|
||||
|
||||
Structure which describes an attribute of a type which corresponds to a C
|
||||
struct member. Its fields are:
|
||||
|
||||
+------------------+---------------+-------------------------------+
|
||||
| Field | C Type | Meaning |
|
||||
+==================+===============+===============================+
|
||||
| :attr:`name` | const char \* | name of the member |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`!type` | int | the type of the member in the |
|
||||
| | | C struct |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`offset` | Py_ssize_t | the offset in bytes that the |
|
||||
| | | member is located on the |
|
||||
| | | type's object struct |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`flags` | int | flag bits indicating if the |
|
||||
| | | field should be read-only or |
|
||||
| | | writable |
|
||||
+------------------+---------------+-------------------------------+
|
||||
| :attr:`doc` | const char \* | points to the contents of the |
|
||||
| | | docstring |
|
||||
+------------------+---------------+-------------------------------+
|
||||
|
||||
:attr:`!type` can be one of many ``T_`` macros corresponding to various C
|
||||
types. When the member is accessed in Python, it will be converted to the
|
||||
equivalent Python type.
|
||||
|
||||
=============== ==================
|
||||
Macro name C type
|
||||
=============== ==================
|
||||
T_SHORT short
|
||||
T_INT int
|
||||
T_LONG long
|
||||
T_FLOAT float
|
||||
T_DOUBLE double
|
||||
T_STRING const char \*
|
||||
T_OBJECT PyObject \*
|
||||
T_OBJECT_EX PyObject \*
|
||||
T_CHAR char
|
||||
T_BYTE char
|
||||
T_UBYTE unsigned char
|
||||
T_UINT unsigned int
|
||||
T_USHORT unsigned short
|
||||
T_ULONG unsigned long
|
||||
T_BOOL char
|
||||
T_LONGLONG long long
|
||||
T_ULONGLONG unsigned long long
|
||||
T_PYSSIZET Py_ssize_t
|
||||
=============== ==================
|
||||
|
||||
:c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX` differ in that
|
||||
:c:macro:`T_OBJECT` returns ``None`` if the member is *NULL* and
|
||||
:c:macro:`T_OBJECT_EX` raises an :exc:`AttributeError`. Try to use
|
||||
:c:macro:`T_OBJECT_EX` over :c:macro:`T_OBJECT` because :c:macro:`T_OBJECT_EX`
|
||||
handles use of the :keyword:`del` statement on that attribute more correctly
|
||||
than :c:macro:`T_OBJECT`.
|
||||
|
||||
:attr:`flags` can be ``0`` for write and read access or :c:macro:`READONLY` for
|
||||
read-only access. Using :c:macro:`T_STRING` for :attr:`type` implies
|
||||
:c:macro:`READONLY`. :c:macro:`T_STRING` data is interpreted as UTF-8.
|
||||
Only :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX`
|
||||
members can be deleted. (They are set to *NULL*).
|
||||
|
||||
|
||||
.. c:type:: PyGetSetDef
|
||||
|
||||
Structure to define property-like access for a type. See also description of
|
||||
the :c:member:`PyTypeObject.tp_getset` slot.
|
||||
|
||||
+-------------+------------------+-----------------------------------+
|
||||
| Field | C Type | Meaning |
|
||||
+=============+==================+===================================+
|
||||
| name | const char \* | attribute name |
|
||||
+-------------+------------------+-----------------------------------+
|
||||
| get | getter | C Function to get the attribute |
|
||||
+-------------+------------------+-----------------------------------+
|
||||
| set | setter | optional C function to set or |
|
||||
| | | delete the attribute, if omitted |
|
||||
| | | the attribute is readonly |
|
||||
+-------------+------------------+-----------------------------------+
|
||||
| doc | const char \* | optional docstring |
|
||||
+-------------+------------------+-----------------------------------+
|
||||
| closure | void \* | optional function pointer, |
|
||||
| | | providing additional data for |
|
||||
| | | getter and setter |
|
||||
+-------------+------------------+-----------------------------------+
|
||||
|
||||
The ``get`` function takes one :c:type:`PyObject\*` parameter (the
|
||||
instance) and a function pointer (the associated ``closure``)::
|
||||
|
||||
typedef PyObject *(*getter)(PyObject *, void *);
|
||||
|
||||
It should return a new reference on success or *NULL* with a set exception
|
||||
on failure.
|
||||
|
||||
``set`` functions take two :c:type:`PyObject\*` parameters (the instance and
|
||||
the value to be set) and a function pointer (the associated ``closure``)::
|
||||
|
||||
typedef int (*setter)(PyObject *, PyObject *, void *);
|
||||
|
||||
In case the attribute should be deleted the second parameter is *NULL*.
|
||||
Should return ``0`` on success or ``-1`` with a set exception on failure.
|
||||
329
python-3.7.4-docs-html/_sources/c-api/sys.rst.txt
Normal file
329
python-3.7.4-docs-html/_sources/c-api/sys.rst.txt
Normal file
@@ -0,0 +1,329 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _os:
|
||||
|
||||
Operating System Utilities
|
||||
==========================
|
||||
|
||||
.. c:function:: PyObject* PyOS_FSPath(PyObject *path)
|
||||
|
||||
Return the file system representation for *path*. If the object is a
|
||||
:class:`str` or :class:`bytes` object, then its reference count is
|
||||
incremented. If the object implements the :class:`os.PathLike` interface,
|
||||
then :meth:`~os.PathLike.__fspath__` is returned as long as it is a
|
||||
:class:`str` or :class:`bytes` object. Otherwise :exc:`TypeError` is raised
|
||||
and ``NULL`` is returned.
|
||||
|
||||
.. versionadded:: 3.6
|
||||
|
||||
|
||||
.. c:function:: int Py_FdIsInteractive(FILE *fp, const char *filename)
|
||||
|
||||
Return true (nonzero) if the standard I/O file *fp* with name *filename* is
|
||||
deemed interactive. This is the case for files for which ``isatty(fileno(fp))``
|
||||
is true. If the global flag :c:data:`Py_InteractiveFlag` is true, this function
|
||||
also returns true if the *filename* pointer is *NULL* or if the name is equal to
|
||||
one of the strings ``'<stdin>'`` or ``'???'``.
|
||||
|
||||
|
||||
.. c:function:: void PyOS_BeforeFork()
|
||||
|
||||
Function to prepare some internal state before a process fork. This
|
||||
should be called before calling :c:func:`fork` or any similar function
|
||||
that clones the current process.
|
||||
Only available on systems where :c:func:`fork` is defined.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. c:function:: void PyOS_AfterFork_Parent()
|
||||
|
||||
Function to update some internal state after a process fork. This
|
||||
should be called from the parent process after calling :c:func:`fork`
|
||||
or any similar function that clones the current process, regardless
|
||||
of whether process cloning was successful.
|
||||
Only available on systems where :c:func:`fork` is defined.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
|
||||
.. c:function:: void PyOS_AfterFork_Child()
|
||||
|
||||
Function to update internal interpreter state after a process fork.
|
||||
This must be called from the child process after calling :c:func:`fork`,
|
||||
or any similar function that clones the current process, if there is
|
||||
any chance the process will call back into the Python interpreter.
|
||||
Only available on systems where :c:func:`fork` is defined.
|
||||
|
||||
.. versionadded:: 3.7
|
||||
|
||||
.. seealso::
|
||||
:func:`os.register_at_fork` allows registering custom Python functions
|
||||
to be called by :c:func:`PyOS_BeforeFork()`,
|
||||
:c:func:`PyOS_AfterFork_Parent` and :c:func:`PyOS_AfterFork_Child`.
|
||||
|
||||
|
||||
.. c:function:: void PyOS_AfterFork()
|
||||
|
||||
Function to update some internal state after a process fork; this should be
|
||||
called in the new process if the Python interpreter will continue to be used.
|
||||
If a new executable is loaded into the new process, this function does not need
|
||||
to be called.
|
||||
|
||||
.. deprecated:: 3.7
|
||||
This function is superseded by :c:func:`PyOS_AfterFork_Child()`.
|
||||
|
||||
|
||||
.. c:function:: int PyOS_CheckStack()
|
||||
|
||||
Return true when the interpreter runs out of stack space. This is a reliable
|
||||
check, but is only available when :const:`USE_STACKCHECK` is defined (currently
|
||||
on Windows using the Microsoft Visual C++ compiler). :const:`USE_STACKCHECK`
|
||||
will be defined automatically; you should never change the definition in your
|
||||
own code.
|
||||
|
||||
|
||||
.. c:function:: PyOS_sighandler_t PyOS_getsig(int i)
|
||||
|
||||
Return the current signal handler for signal *i*. This is a thin wrapper around
|
||||
either :c:func:`sigaction` or :c:func:`signal`. Do not call those functions
|
||||
directly! :c:type:`PyOS_sighandler_t` is a typedef alias for :c:type:`void
|
||||
(\*)(int)`.
|
||||
|
||||
|
||||
.. c:function:: PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h)
|
||||
|
||||
Set the signal handler for signal *i* to be *h*; return the old signal handler.
|
||||
This is a thin wrapper around either :c:func:`sigaction` or :c:func:`signal`. Do
|
||||
not call those functions directly! :c:type:`PyOS_sighandler_t` is a typedef
|
||||
alias for :c:type:`void (\*)(int)`.
|
||||
|
||||
.. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size)
|
||||
|
||||
Decode a byte string from the locale encoding with the :ref:`surrogateescape
|
||||
error handler <surrogateescape>`: undecodable bytes are decoded as
|
||||
characters in range U+DC80..U+DCFF. If a byte sequence can be decoded as a
|
||||
surrogate character, escape the bytes using the surrogateescape error
|
||||
handler instead of decoding them.
|
||||
|
||||
Encoding, highest priority to lowest priority:
|
||||
|
||||
* ``UTF-8`` on macOS and Android;
|
||||
* ``UTF-8`` if the Python UTF-8 mode is enabled;
|
||||
* ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``,
|
||||
``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias),
|
||||
and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the
|
||||
``ISO-8859-1`` encoding.
|
||||
* the current locale encoding.
|
||||
|
||||
Return a pointer to a newly allocated wide character string, use
|
||||
:c:func:`PyMem_RawFree` to free the memory. If size is not ``NULL``, write
|
||||
the number of wide characters excluding the null character into ``*size``
|
||||
|
||||
Return ``NULL`` on decoding error or memory allocation error. If *size* is
|
||||
not ``NULL``, ``*size`` is set to ``(size_t)-1`` on memory error or set to
|
||||
``(size_t)-2`` on decoding error.
|
||||
|
||||
Decoding errors should never happen, unless there is a bug in the C
|
||||
library.
|
||||
|
||||
Use the :c:func:`Py_EncodeLocale` function to encode the character string
|
||||
back to a byte string.
|
||||
|
||||
.. seealso::
|
||||
|
||||
The :c:func:`PyUnicode_DecodeFSDefaultAndSize` and
|
||||
:c:func:`PyUnicode_DecodeLocaleAndSize` functions.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
The function now uses the UTF-8 encoding in the UTF-8 mode.
|
||||
|
||||
|
||||
.. c:function:: char* Py_EncodeLocale(const wchar_t *text, size_t *error_pos)
|
||||
|
||||
Encode a wide character string to the locale encoding with the
|
||||
:ref:`surrogateescape error handler <surrogateescape>`: surrogate characters
|
||||
in the range U+DC80..U+DCFF are converted to bytes 0x80..0xFF.
|
||||
|
||||
Encoding, highest priority to lowest priority:
|
||||
|
||||
* ``UTF-8`` on macOS and Android;
|
||||
* ``UTF-8`` if the Python UTF-8 mode is enabled;
|
||||
* ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``,
|
||||
``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias),
|
||||
and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the
|
||||
``ISO-8859-1`` encoding.
|
||||
* the current locale encoding.
|
||||
|
||||
The function uses the UTF-8 encoding in the Python UTF-8 mode.
|
||||
|
||||
Return a pointer to a newly allocated byte string, use :c:func:`PyMem_Free`
|
||||
to free the memory. Return ``NULL`` on encoding error or memory allocation
|
||||
error
|
||||
|
||||
If error_pos is not ``NULL``, ``*error_pos`` is set to ``(size_t)-1`` on
|
||||
success, or set to the index of the invalid character on encoding error.
|
||||
|
||||
Use the :c:func:`Py_DecodeLocale` function to decode the bytes string back
|
||||
to a wide character string.
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
The function now uses the UTF-8 encoding in the UTF-8 mode.
|
||||
|
||||
.. seealso::
|
||||
|
||||
The :c:func:`PyUnicode_EncodeFSDefault` and
|
||||
:c:func:`PyUnicode_EncodeLocale` functions.
|
||||
|
||||
.. versionadded:: 3.5
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
The function now supports the UTF-8 mode.
|
||||
|
||||
|
||||
.. _systemfunctions:
|
||||
|
||||
System Functions
|
||||
================
|
||||
|
||||
These are utility functions that make functionality from the :mod:`sys` module
|
||||
accessible to C code. They all work with the current interpreter thread's
|
||||
:mod:`sys` module's dict, which is contained in the internal thread state structure.
|
||||
|
||||
.. c:function:: PyObject *PySys_GetObject(const char *name)
|
||||
|
||||
Return the object *name* from the :mod:`sys` module or *NULL* if it does
|
||||
not exist, without setting an exception.
|
||||
|
||||
.. c:function:: int PySys_SetObject(const char *name, PyObject *v)
|
||||
|
||||
Set *name* in the :mod:`sys` module to *v* unless *v* is *NULL*, in which
|
||||
case *name* is deleted from the sys module. Returns ``0`` on success, ``-1``
|
||||
on error.
|
||||
|
||||
.. c:function:: void PySys_ResetWarnOptions()
|
||||
|
||||
Reset :data:`sys.warnoptions` to an empty list. This function may be
|
||||
called prior to :c:func:`Py_Initialize`.
|
||||
|
||||
.. c:function:: void PySys_AddWarnOption(const wchar_t *s)
|
||||
|
||||
Append *s* to :data:`sys.warnoptions`. This function must be called prior
|
||||
to :c:func:`Py_Initialize` in order to affect the warnings filter list.
|
||||
|
||||
.. c:function:: void PySys_AddWarnOptionUnicode(PyObject *unicode)
|
||||
|
||||
Append *unicode* to :data:`sys.warnoptions`.
|
||||
|
||||
Note: this function is not currently usable from outside the CPython
|
||||
implementation, as it must be called prior to the implicit import of
|
||||
:mod:`warnings` in :c:func:`Py_Initialize` to be effective, but can't be
|
||||
called until enough of the runtime has been initialized to permit the
|
||||
creation of Unicode objects.
|
||||
|
||||
.. c:function:: void PySys_SetPath(const wchar_t *path)
|
||||
|
||||
Set :data:`sys.path` to a list object of paths found in *path* which should
|
||||
be a list of paths separated with the platform's search path delimiter
|
||||
(``:`` on Unix, ``;`` on Windows).
|
||||
|
||||
.. c:function:: void PySys_WriteStdout(const char *format, ...)
|
||||
|
||||
Write the output string described by *format* to :data:`sys.stdout`. No
|
||||
exceptions are raised, even if truncation occurs (see below).
|
||||
|
||||
*format* should limit the total size of the formatted output string to
|
||||
1000 bytes or less -- after 1000 bytes, the output string is truncated.
|
||||
In particular, this means that no unrestricted "%s" formats should occur;
|
||||
these should be limited using "%.<N>s" where <N> is a decimal number
|
||||
calculated so that <N> plus the maximum size of other formatted text does not
|
||||
exceed 1000 bytes. Also watch out for "%f", which can print hundreds of
|
||||
digits for very large numbers.
|
||||
|
||||
If a problem occurs, or :data:`sys.stdout` is unset, the formatted message
|
||||
is written to the real (C level) *stdout*.
|
||||
|
||||
.. c:function:: void PySys_WriteStderr(const char *format, ...)
|
||||
|
||||
As :c:func:`PySys_WriteStdout`, but write to :data:`sys.stderr` or *stderr*
|
||||
instead.
|
||||
|
||||
.. c:function:: void PySys_FormatStdout(const char *format, ...)
|
||||
|
||||
Function similar to PySys_WriteStdout() but format the message using
|
||||
:c:func:`PyUnicode_FromFormatV` and don't truncate the message to an
|
||||
arbitrary length.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. c:function:: void PySys_FormatStderr(const char *format, ...)
|
||||
|
||||
As :c:func:`PySys_FormatStdout`, but write to :data:`sys.stderr` or *stderr*
|
||||
instead.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. c:function:: void PySys_AddXOption(const wchar_t *s)
|
||||
|
||||
Parse *s* as a set of :option:`-X` options and add them to the current
|
||||
options mapping as returned by :c:func:`PySys_GetXOptions`. This function
|
||||
may be called prior to :c:func:`Py_Initialize`.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. c:function:: PyObject *PySys_GetXOptions()
|
||||
|
||||
Return the current dictionary of :option:`-X` options, similarly to
|
||||
:data:`sys._xoptions`. On error, *NULL* is returned and an exception is
|
||||
set.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
|
||||
.. _processcontrol:
|
||||
|
||||
Process Control
|
||||
===============
|
||||
|
||||
|
||||
.. c:function:: void Py_FatalError(const char *message)
|
||||
|
||||
.. index:: single: abort()
|
||||
|
||||
Print a fatal error message and kill the process. No cleanup is performed.
|
||||
This function should only be invoked when a condition is detected that would
|
||||
make it dangerous to continue using the Python interpreter; e.g., when the
|
||||
object administration appears to be corrupted. On Unix, the standard C library
|
||||
function :c:func:`abort` is called which will attempt to produce a :file:`core`
|
||||
file.
|
||||
|
||||
|
||||
.. c:function:: void Py_Exit(int status)
|
||||
|
||||
.. index::
|
||||
single: Py_FinalizeEx()
|
||||
single: exit()
|
||||
|
||||
Exit the current process. This calls :c:func:`Py_FinalizeEx` and then calls the
|
||||
standard C library function ``exit(status)``. If :c:func:`Py_FinalizeEx`
|
||||
indicates an error, the exit status is set to 120.
|
||||
|
||||
.. versionchanged:: 3.6
|
||||
Errors from finalization no longer ignored.
|
||||
|
||||
|
||||
.. c:function:: int Py_AtExit(void (*func) ())
|
||||
|
||||
.. index::
|
||||
single: Py_FinalizeEx()
|
||||
single: cleanup functions
|
||||
|
||||
Register a cleanup function to be called by :c:func:`Py_FinalizeEx`. The cleanup
|
||||
function will be called with no arguments and should return no value. At most
|
||||
32 cleanup functions can be registered. When the registration is successful,
|
||||
:c:func:`Py_AtExit` returns ``0``; on failure, it returns ``-1``. The cleanup
|
||||
function registered last is called first. Each cleanup function will be called
|
||||
at most once. Since Python's internal finalization will have completed before
|
||||
the cleanup function, no Python APIs should be called by *func*.
|
||||
218
python-3.7.4-docs-html/_sources/c-api/tuple.rst.txt
Normal file
218
python-3.7.4-docs-html/_sources/c-api/tuple.rst.txt
Normal file
@@ -0,0 +1,218 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _tupleobjects:
|
||||
|
||||
Tuple Objects
|
||||
-------------
|
||||
|
||||
.. index:: object: tuple
|
||||
|
||||
|
||||
.. c:type:: PyTupleObject
|
||||
|
||||
This subtype of :c:type:`PyObject` represents a Python tuple object.
|
||||
|
||||
|
||||
.. c:var:: PyTypeObject PyTuple_Type
|
||||
|
||||
This instance of :c:type:`PyTypeObject` represents the Python tuple type; it
|
||||
is the same object as :class:`tuple` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyTuple_Check(PyObject *p)
|
||||
|
||||
Return true if *p* is a tuple object or an instance of a subtype of the tuple
|
||||
type.
|
||||
|
||||
|
||||
.. c:function:: int PyTuple_CheckExact(PyObject *p)
|
||||
|
||||
Return true if *p* is a tuple object, but not an instance of a subtype of the
|
||||
tuple type.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTuple_New(Py_ssize_t len)
|
||||
|
||||
Return a new tuple object of size *len*, or *NULL* on failure.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTuple_Pack(Py_ssize_t n, ...)
|
||||
|
||||
Return a new tuple object of size *n*, or *NULL* on failure. The tuple values
|
||||
are initialized to the subsequent *n* C arguments pointing to Python objects.
|
||||
``PyTuple_Pack(2, a, b)`` is equivalent to ``Py_BuildValue("(OO)", a, b)``.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyTuple_Size(PyObject *p)
|
||||
|
||||
Take a pointer to a tuple object, and return the size of that tuple.
|
||||
|
||||
|
||||
.. c:function:: Py_ssize_t PyTuple_GET_SIZE(PyObject *p)
|
||||
|
||||
Return the size of the tuple *p*, which must be non-*NULL* and point to a tuple;
|
||||
no error checking is performed.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos)
|
||||
|
||||
Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is
|
||||
out of bounds, return *NULL* and sets an :exc:`IndexError` exception.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)
|
||||
|
||||
Like :c:func:`PyTuple_GetItem`, but does no checking of its arguments.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high)
|
||||
|
||||
Take a slice of the tuple pointed to by *p* from *low* to *high* and return it
|
||||
as a new tuple.
|
||||
|
||||
|
||||
.. c:function:: int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
|
||||
|
||||
Insert a reference to object *o* at position *pos* of the tuple pointed to by
|
||||
*p*. Return ``0`` on success.
|
||||
|
||||
.. note::
|
||||
|
||||
This function "steals" a reference to *o*.
|
||||
|
||||
|
||||
.. c:function:: void PyTuple_SET_ITEM(PyObject *p, Py_ssize_t pos, PyObject *o)
|
||||
|
||||
Like :c:func:`PyTuple_SetItem`, but does no error checking, and should *only* be
|
||||
used to fill in brand new tuples.
|
||||
|
||||
.. note::
|
||||
|
||||
This function "steals" a reference to *o*.
|
||||
|
||||
|
||||
.. c:function:: int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize)
|
||||
|
||||
Can be used to resize a tuple. *newsize* will be the new length of the tuple.
|
||||
Because tuples are *supposed* to be immutable, this should only be used if there
|
||||
is only one reference to the object. Do *not* use this if the tuple may already
|
||||
be known to some other part of the code. The tuple will always grow or shrink
|
||||
at the end. Think of this as destroying the old tuple and creating a new one,
|
||||
only more efficiently. Returns ``0`` on success. Client code should never
|
||||
assume that the resulting value of ``*p`` will be the same as before calling
|
||||
this function. If the object referenced by ``*p`` is replaced, the original
|
||||
``*p`` is destroyed. On failure, returns ``-1`` and sets ``*p`` to *NULL*, and
|
||||
raises :exc:`MemoryError` or :exc:`SystemError`.
|
||||
|
||||
|
||||
.. c:function:: int PyTuple_ClearFreeList()
|
||||
|
||||
Clear the free list. Return the total number of freed items.
|
||||
|
||||
|
||||
Struct Sequence Objects
|
||||
-----------------------
|
||||
|
||||
Struct sequence objects are the C equivalent of :func:`~collections.namedtuple`
|
||||
objects, i.e. a sequence whose items can also be accessed through attributes.
|
||||
To create a struct sequence, you first have to create a specific struct sequence
|
||||
type.
|
||||
|
||||
.. c:function:: PyTypeObject* PyStructSequence_NewType(PyStructSequence_Desc *desc)
|
||||
|
||||
Create a new struct sequence type from the data in *desc*, described below. Instances
|
||||
of the resulting type can be created with :c:func:`PyStructSequence_New`.
|
||||
|
||||
|
||||
.. c:function:: void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||
|
||||
Initializes a struct sequence type *type* from *desc* in place.
|
||||
|
||||
|
||||
.. c:function:: int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||
|
||||
The same as ``PyStructSequence_InitType``, but returns ``0`` on success and ``-1`` on
|
||||
failure.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
||||
.. c:type:: PyStructSequence_Desc
|
||||
|
||||
Contains the meta information of a struct sequence type to create.
|
||||
|
||||
+-------------------+------------------------------+------------------------------------+
|
||||
| Field | C Type | Meaning |
|
||||
+===================+==============================+====================================+
|
||||
| ``name`` | ``const char *`` | name of the struct sequence type |
|
||||
+-------------------+------------------------------+------------------------------------+
|
||||
| ``doc`` | ``const char *`` | pointer to docstring for the type |
|
||||
| | | or NULL to omit |
|
||||
+-------------------+------------------------------+------------------------------------+
|
||||
| ``fields`` | ``PyStructSequence_Field *`` | pointer to *NULL*-terminated array |
|
||||
| | | with field names of the new type |
|
||||
+-------------------+------------------------------+------------------------------------+
|
||||
| ``n_in_sequence`` | ``int`` | number of fields visible to the |
|
||||
| | | Python side (if used as tuple) |
|
||||
+-------------------+------------------------------+------------------------------------+
|
||||
|
||||
|
||||
.. c:type:: PyStructSequence_Field
|
||||
|
||||
Describes a field of a struct sequence. As a struct sequence is modeled as a
|
||||
tuple, all fields are typed as :c:type:`PyObject\*`. The index in the
|
||||
:attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which
|
||||
field of the struct sequence is described.
|
||||
|
||||
+-----------+------------------+--------------------------------------+
|
||||
| Field | C Type | Meaning |
|
||||
+===========+==================+======================================+
|
||||
| ``name`` | ``const char *`` | name for the field or *NULL* to end |
|
||||
| | | the list of named fields, set to |
|
||||
| | | PyStructSequence_UnnamedField to |
|
||||
| | | leave unnamed |
|
||||
+-----------+------------------+--------------------------------------+
|
||||
| ``doc`` | ``const char *`` | field docstring or *NULL* to omit |
|
||||
+-----------+------------------+--------------------------------------+
|
||||
|
||||
|
||||
.. c:var:: char* PyStructSequence_UnnamedField
|
||||
|
||||
Special value for a field name to leave it unnamed.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyStructSequence_New(PyTypeObject *type)
|
||||
|
||||
Creates an instance of *type*, which must have been created with
|
||||
:c:func:`PyStructSequence_NewType`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos)
|
||||
|
||||
Return the object at position *pos* in the struct sequence pointed to by *p*.
|
||||
No bounds checking is performed.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos)
|
||||
|
||||
Macro equivalent of :c:func:`PyStructSequence_GetItem`.
|
||||
|
||||
|
||||
.. c:function:: void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
|
||||
|
||||
Sets the field at index *pos* of the struct sequence *p* to value *o*. Like
|
||||
:c:func:`PyTuple_SET_ITEM`, this should only be used to fill in brand new
|
||||
instances.
|
||||
|
||||
.. note::
|
||||
|
||||
This function "steals" a reference to *o*.
|
||||
|
||||
|
||||
.. c:function:: void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o)
|
||||
|
||||
Macro equivalent of :c:func:`PyStructSequence_SetItem`.
|
||||
|
||||
.. note::
|
||||
|
||||
This function "steals" a reference to *o*.
|
||||
118
python-3.7.4-docs-html/_sources/c-api/type.rst.txt
Normal file
118
python-3.7.4-docs-html/_sources/c-api/type.rst.txt
Normal file
@@ -0,0 +1,118 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _typeobjects:
|
||||
|
||||
Type Objects
|
||||
------------
|
||||
|
||||
.. index:: object: type
|
||||
|
||||
|
||||
.. c:type:: PyTypeObject
|
||||
|
||||
The C structure of the objects used to describe built-in types.
|
||||
|
||||
|
||||
.. c:var:: PyObject* PyType_Type
|
||||
|
||||
This is the type object for type objects; it is the same object as
|
||||
:class:`type` in the Python layer.
|
||||
|
||||
|
||||
.. c:function:: int PyType_Check(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a type object, including instances of types
|
||||
derived from the standard type object. Return false in all other cases.
|
||||
|
||||
|
||||
.. c:function:: int PyType_CheckExact(PyObject *o)
|
||||
|
||||
Return true if the object *o* is a type object, but not a subtype of the
|
||||
standard type object. Return false in all other cases.
|
||||
|
||||
|
||||
.. c:function:: unsigned int PyType_ClearCache()
|
||||
|
||||
Clear the internal lookup cache. Return the current version tag.
|
||||
|
||||
.. c:function:: unsigned long PyType_GetFlags(PyTypeObject* type)
|
||||
|
||||
Return the :c:member:`~PyTypeObject.tp_flags` member of *type*. This function is primarily
|
||||
meant for use with `Py_LIMITED_API`; the individual flag bits are
|
||||
guaranteed to be stable across Python releases, but access to
|
||||
:c:member:`~PyTypeObject.tp_flags` itself is not part of the limited API.
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
The return type is now ``unsigned long`` rather than ``long``.
|
||||
|
||||
|
||||
.. c:function:: void PyType_Modified(PyTypeObject *type)
|
||||
|
||||
Invalidate the internal lookup cache for the type and all of its
|
||||
subtypes. This function must be called after any manual
|
||||
modification of the attributes or base classes of the type.
|
||||
|
||||
|
||||
.. c:function:: int PyType_HasFeature(PyTypeObject *o, int feature)
|
||||
|
||||
Return true if the type object *o* sets the feature *feature*. Type features
|
||||
are denoted by single bit flags.
|
||||
|
||||
|
||||
.. c:function:: int PyType_IS_GC(PyTypeObject *o)
|
||||
|
||||
Return true if the type object includes support for the cycle detector; this
|
||||
tests the type flag :const:`Py_TPFLAGS_HAVE_GC`.
|
||||
|
||||
|
||||
.. c:function:: int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
|
||||
|
||||
Return true if *a* is a subtype of *b*.
|
||||
|
||||
This function only checks for actual subtypes, which means that
|
||||
:meth:`~class.__subclasscheck__` is not called on *b*. Call
|
||||
:c:func:`PyObject_IsSubclass` to do the same check that :func:`issubclass`
|
||||
would do.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
|
||||
|
||||
Generic handler for the :c:member:`~PyTypeObject.tp_alloc` slot of a type object. Use
|
||||
Python's default memory allocation mechanism to allocate a new instance and
|
||||
initialize all its contents to *NULL*.
|
||||
|
||||
.. c:function:: PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
|
||||
Generic handler for the :c:member:`~PyTypeObject.tp_new` slot of a type object. Create a
|
||||
new instance using the type's :c:member:`~PyTypeObject.tp_alloc` slot.
|
||||
|
||||
.. c:function:: int PyType_Ready(PyTypeObject *type)
|
||||
|
||||
Finalize a type object. This should be called on all type objects to finish
|
||||
their initialization. This function is responsible for adding inherited slots
|
||||
from a type's base class. Return ``0`` on success, or return ``-1`` and sets an
|
||||
exception on error.
|
||||
|
||||
.. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec)
|
||||
|
||||
Creates and returns a heap type object from the *spec* passed to the function.
|
||||
|
||||
.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
|
||||
|
||||
Creates and returns a heap type object from the *spec*. In addition to that,
|
||||
the created heap type contains all types contained by the *bases* tuple as base
|
||||
types. This allows the caller to reference other heap types as base types.
|
||||
|
||||
.. versionadded:: 3.3
|
||||
|
||||
.. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot)
|
||||
|
||||
Return the function pointer stored in the given slot. If the
|
||||
result is *NULL*, this indicates that either the slot is *NULL*,
|
||||
or that the function was called with invalid parameters.
|
||||
Callers will typically cast the result pointer into the appropriate
|
||||
function type.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
1418
python-3.7.4-docs-html/_sources/c-api/typeobj.rst.txt
Normal file
1418
python-3.7.4-docs-html/_sources/c-api/typeobj.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
1726
python-3.7.4-docs-html/_sources/c-api/unicode.rst.txt
Normal file
1726
python-3.7.4-docs-html/_sources/c-api/unicode.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
21
python-3.7.4-docs-html/_sources/c-api/utilities.rst.txt
Normal file
21
python-3.7.4-docs-html/_sources/c-api/utilities.rst.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _utilities:
|
||||
|
||||
*********
|
||||
Utilities
|
||||
*********
|
||||
|
||||
The functions in this chapter perform various utility tasks, ranging from
|
||||
helping C code be more portable across platforms, using Python modules from C,
|
||||
and parsing function arguments and constructing Python values from C values.
|
||||
|
||||
.. toctree::
|
||||
|
||||
sys.rst
|
||||
import.rst
|
||||
marshal.rst
|
||||
arg.rst
|
||||
conversion.rst
|
||||
reflection.rst
|
||||
codec.rst
|
||||
394
python-3.7.4-docs-html/_sources/c-api/veryhigh.rst.txt
Normal file
394
python-3.7.4-docs-html/_sources/c-api/veryhigh.rst.txt
Normal file
@@ -0,0 +1,394 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _veryhigh:
|
||||
|
||||
*************************
|
||||
The Very High Level Layer
|
||||
*************************
|
||||
|
||||
The functions in this chapter will let you execute Python source code given in a
|
||||
file or a buffer, but they will not let you interact in a more detailed way with
|
||||
the interpreter.
|
||||
|
||||
Several of these functions accept a start symbol from the grammar as a
|
||||
parameter. The available start symbols are :const:`Py_eval_input`,
|
||||
:const:`Py_file_input`, and :const:`Py_single_input`. These are described
|
||||
following the functions which accept them as parameters.
|
||||
|
||||
Note also that several of these functions take :c:type:`FILE\*` parameters. One
|
||||
particular issue which needs to be handled carefully is that the :c:type:`FILE`
|
||||
structure for different C libraries can be different and incompatible. Under
|
||||
Windows (at least), it is possible for dynamically linked extensions to actually
|
||||
use different libraries, so care should be taken that :c:type:`FILE\*` parameters
|
||||
are only passed to these functions if it is certain that they were created by
|
||||
the same library that the Python runtime is using.
|
||||
|
||||
|
||||
.. c:function:: int Py_Main(int argc, wchar_t **argv)
|
||||
|
||||
The main program for the standard interpreter. This is made available for
|
||||
programs which embed Python. The *argc* and *argv* parameters should be
|
||||
prepared exactly as those which are passed to a C program's :c:func:`main`
|
||||
function (converted to wchar_t according to the user's locale). It is
|
||||
important to note that the argument list may be modified (but the contents of
|
||||
the strings pointed to by the argument list are not). The return value will
|
||||
be ``0`` if the interpreter exits normally (i.e., without an exception),
|
||||
``1`` if the interpreter exits due to an exception, or ``2`` if the parameter
|
||||
list does not represent a valid Python command line.
|
||||
|
||||
Note that if an otherwise unhandled :exc:`SystemExit` is raised, this
|
||||
function will not return ``1``, but exit the process, as long as
|
||||
``Py_InspectFlag`` is not set.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_AnyFile(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving
|
||||
*closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving
|
||||
the *closeit* argument set to ``0``.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving
|
||||
the *flags* argument set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
If *fp* refers to a file associated with an interactive device (console or
|
||||
terminal input or Unix pseudo-terminal), return the value of
|
||||
:c:func:`PyRun_InteractiveLoop`, otherwise return the result of
|
||||
:c:func:`PyRun_SimpleFile`. *filename* is decoded from the filesystem
|
||||
encoding (:func:`sys.getfilesystemencoding`). If *filename* is *NULL*, this
|
||||
function uses ``"???"`` as the filename.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_SimpleString(const char *command)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_SimpleStringFlags` below,
|
||||
leaving the *PyCompilerFlags\** argument set to NULL.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
|
||||
|
||||
Executes the Python source code from *command* in the :mod:`__main__` module
|
||||
according to the *flags* argument. If :mod:`__main__` does not already exist, it
|
||||
is created. Returns ``0`` on success or ``-1`` if an exception was raised. If
|
||||
there was an error, there is no way to get the exception information. For the
|
||||
meaning of *flags*, see below.
|
||||
|
||||
Note that if an otherwise unhandled :exc:`SystemExit` is raised, this
|
||||
function will not return ``-1``, but exit the process, as long as
|
||||
``Py_InspectFlag`` is not set.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_SimpleFile(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
|
||||
leaving *closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
Similar to :c:func:`PyRun_SimpleStringFlags`, but the Python source code is read
|
||||
from *fp* instead of an in-memory string. *filename* should be the name of
|
||||
the file, it is decoded from the filesystem encoding
|
||||
(:func:`sys.getfilesystemencoding`). If *closeit* is true, the file is
|
||||
closed before PyRun_SimpleFileExFlags returns.
|
||||
|
||||
.. note::
|
||||
On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``.
|
||||
Otherwise, Python may not handle script file with LF line ending correctly.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_InteractiveOne(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_InteractiveOneFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
Read and execute a single statement from a file associated with an
|
||||
interactive device according to the *flags* argument. The user will be
|
||||
prompted using ``sys.ps1`` and ``sys.ps2``. *filename* is decoded from the
|
||||
filesystem encoding (:func:`sys.getfilesystemencoding`).
|
||||
|
||||
Returns ``0`` when the input was
|
||||
executed successfully, ``-1`` if there was an exception, or an error code
|
||||
from the :file:`errcode.h` include file distributed as part of Python if
|
||||
there was a parse error. (Note that :file:`errcode.h` is not included by
|
||||
:file:`Python.h`, so must be included specifically if needed.)
|
||||
|
||||
|
||||
.. c:function:: int PyRun_InteractiveLoop(FILE *fp, const char *filename)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_InteractiveLoopFlags` below,
|
||||
leaving *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
|
||||
|
||||
Read and execute statements from a file associated with an interactive device
|
||||
until EOF is reached. The user will be prompted using ``sys.ps1`` and
|
||||
``sys.ps2``. *filename* is decoded from the filesystem encoding
|
||||
(:func:`sys.getfilesystemencoding`). Returns ``0`` at EOF or a negative
|
||||
number upon failure.
|
||||
|
||||
|
||||
.. c:var:: int (*PyOS_InputHook)(void)
|
||||
|
||||
Can be set to point to a function with the prototype
|
||||
``int func(void)``. The function will be called when Python's
|
||||
interpreter prompt is about to become idle and wait for user input
|
||||
from the terminal. The return value is ignored. Overriding this
|
||||
hook can be used to integrate the interpreter's prompt with other
|
||||
event loops, as done in the :file:`Modules/_tkinter.c` in the
|
||||
Python source code.
|
||||
|
||||
|
||||
.. c:var:: char* (*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)
|
||||
|
||||
Can be set to point to a function with the prototype
|
||||
``char *func(FILE *stdin, FILE *stdout, char *prompt)``,
|
||||
overriding the default function used to read a single line of input
|
||||
at the interpreter's prompt. The function is expected to output
|
||||
the string *prompt* if it's not *NULL*, and then read a line of
|
||||
input from the provided standard input file, returning the
|
||||
resulting string. For example, The :mod:`readline` module sets
|
||||
this hook to provide line-editing and tab-completion features.
|
||||
|
||||
The result must be a string allocated by :c:func:`PyMem_RawMalloc` or
|
||||
:c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
The result must be allocated by :c:func:`PyMem_RawMalloc` or
|
||||
:c:func:`PyMem_RawRealloc`, instead of being allocated by
|
||||
:c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`.
|
||||
|
||||
|
||||
.. c:function:: struct _node* PyParser_SimpleParseString(const char *str, int start)
|
||||
|
||||
This is a simplified interface to
|
||||
:c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
|
||||
to *NULL* and *flags* set to ``0``.
|
||||
|
||||
|
||||
.. c:function:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags)
|
||||
|
||||
This is a simplified interface to
|
||||
:c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
|
||||
to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags)
|
||||
|
||||
Parse Python source code from *str* using the start token *start* according to
|
||||
the *flags* argument. The result can be used to create a code object which can
|
||||
be evaluated efficiently. This is useful if a code fragment must be evaluated
|
||||
many times. *filename* is decoded from the filesystem encoding
|
||||
(:func:`sys.getfilesystemencoding`).
|
||||
|
||||
|
||||
.. c:function:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
|
||||
|
||||
This is a simplified interface to :c:func:`PyParser_SimpleParseFileFlags` below,
|
||||
leaving *flags* set to ``0``.
|
||||
|
||||
|
||||
.. c:function:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
|
||||
|
||||
Similar to :c:func:`PyParser_SimpleParseStringFlagsFilename`, but the Python
|
||||
source code is read from *fp* instead of an in-memory string.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_StringFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
|
||||
|
||||
Execute Python source code from *str* in the context specified by the
|
||||
objects *globals* and *locals* with the compiler flags specified by
|
||||
*flags*. *globals* must be a dictionary; *locals* can be any object
|
||||
that implements the mapping protocol. The parameter *start* specifies
|
||||
the start token that should be used to parse the source code.
|
||||
|
||||
Returns the result of executing the code as a Python object, or *NULL* if an
|
||||
exception was raised.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving
|
||||
*closeit* set to ``0`` and *flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving
|
||||
*closeit* set to ``0``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags)
|
||||
|
||||
Similar to :c:func:`PyRun_StringFlags`, but the Python source code is read from
|
||||
*fp* instead of an in-memory string. *filename* should be the name of the file,
|
||||
it is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`).
|
||||
If *closeit* is true, the file is closed before :c:func:`PyRun_FileExFlags`
|
||||
returns.
|
||||
|
||||
|
||||
.. c:function:: PyObject* Py_CompileString(const char *str, const char *filename, int start)
|
||||
|
||||
This is a simplified interface to :c:func:`Py_CompileStringFlags` below, leaving
|
||||
*flags* set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags)
|
||||
|
||||
This is a simplified interface to :c:func:`Py_CompileStringExFlags` below, with
|
||||
*optimize* set to ``-1``.
|
||||
|
||||
|
||||
.. c:function:: PyObject* Py_CompileStringObject(const char *str, PyObject *filename, int start, PyCompilerFlags *flags, int optimize)
|
||||
|
||||
Parse and compile the Python source code in *str*, returning the resulting code
|
||||
object. The start token is given by *start*; this can be used to constrain the
|
||||
code which can be compiled and should be :const:`Py_eval_input`,
|
||||
:const:`Py_file_input`, or :const:`Py_single_input`. The filename specified by
|
||||
*filename* is used to construct the code object and may appear in tracebacks or
|
||||
:exc:`SyntaxError` exception messages. This returns *NULL* if the code
|
||||
cannot be parsed or compiled.
|
||||
|
||||
The integer *optimize* specifies the optimization level of the compiler; a
|
||||
value of ``-1`` selects the optimization level of the interpreter as given by
|
||||
:option:`-O` options. Explicit levels are ``0`` (no optimization;
|
||||
``__debug__`` is true), ``1`` (asserts are removed, ``__debug__`` is false)
|
||||
or ``2`` (docstrings are removed too).
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
|
||||
.. c:function:: PyObject* Py_CompileStringExFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize)
|
||||
|
||||
Like :c:func:`Py_CompileStringObject`, but *filename* is a byte string
|
||||
decoded from the filesystem encoding (:func:`os.fsdecode`).
|
||||
|
||||
.. versionadded:: 3.2
|
||||
|
||||
.. c:function:: PyObject* PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
|
||||
|
||||
This is a simplified interface to :c:func:`PyEval_EvalCodeEx`, with just
|
||||
the code object, and global and local variables. The other arguments are
|
||||
set to *NULL*.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyEval_EvalCodeEx(PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)
|
||||
|
||||
Evaluate a precompiled code object, given a particular environment for its
|
||||
evaluation. This environment consists of a dictionary of global variables,
|
||||
a mapping object of local variables, arrays of arguments, keywords and
|
||||
defaults, a dictionary of default values for :ref:`keyword-only
|
||||
<keyword-only_parameter>` arguments and a closure tuple of cells.
|
||||
|
||||
|
||||
.. c:type:: PyFrameObject
|
||||
|
||||
The C structure of the objects used to describe frame objects. The
|
||||
fields of this type are subject to change at any time.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyEval_EvalFrame(PyFrameObject *f)
|
||||
|
||||
Evaluate an execution frame. This is a simplified interface to
|
||||
:c:func:`PyEval_EvalFrameEx`, for backward compatibility.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
||||
|
||||
This is the main, unvarnished function of Python interpretation. It is
|
||||
literally 2000 lines long. The code object associated with the execution
|
||||
frame *f* is executed, interpreting bytecode and executing calls as needed.
|
||||
The additional *throwflag* parameter can mostly be ignored - if true, then
|
||||
it causes an exception to immediately be thrown; this is used for the
|
||||
:meth:`~generator.throw` methods of generator objects.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
This function now includes a debug assertion to help ensure that it
|
||||
does not silently discard an active exception.
|
||||
|
||||
|
||||
.. c:function:: int PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
|
||||
|
||||
This function changes the flags of the current evaluation frame, and returns
|
||||
true on success, false on failure.
|
||||
|
||||
|
||||
.. c:var:: int Py_eval_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for isolated expressions; for use with
|
||||
:c:func:`Py_CompileString`.
|
||||
|
||||
|
||||
.. c:var:: int Py_file_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for sequences of statements as read
|
||||
from a file or other source; for use with :c:func:`Py_CompileString`. This is
|
||||
the symbol to use when compiling arbitrarily long Python source code.
|
||||
|
||||
|
||||
.. c:var:: int Py_single_input
|
||||
|
||||
.. index:: single: Py_CompileString()
|
||||
|
||||
The start symbol from the Python grammar for a single statement; for use with
|
||||
:c:func:`Py_CompileString`. This is the symbol used for the interactive
|
||||
interpreter loop.
|
||||
|
||||
|
||||
.. c:type:: struct PyCompilerFlags
|
||||
|
||||
This is the structure used to hold compiler flags. In cases where code is only
|
||||
being compiled, it is passed as ``int flags``, and in cases where code is being
|
||||
executed, it is passed as ``PyCompilerFlags *flags``. In this case, ``from
|
||||
__future__ import`` can modify *flags*.
|
||||
|
||||
Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as
|
||||
equal to ``0``, and any modification due to ``from __future__ import`` is
|
||||
discarded. ::
|
||||
|
||||
struct PyCompilerFlags {
|
||||
int cf_flags;
|
||||
}
|
||||
|
||||
|
||||
.. c:var:: int CO_FUTURE_DIVISION
|
||||
|
||||
This bit can be set in *flags* to cause division operator ``/`` to be
|
||||
interpreted as "true division" according to :pep:`238`.
|
||||
69
python-3.7.4-docs-html/_sources/c-api/weakref.rst.txt
Normal file
69
python-3.7.4-docs-html/_sources/c-api/weakref.rst.txt
Normal file
@@ -0,0 +1,69 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _weakrefobjects:
|
||||
|
||||
Weak Reference Objects
|
||||
----------------------
|
||||
|
||||
Python supports *weak references* as first-class objects. There are two
|
||||
specific object types which directly implement weak references. The first is a
|
||||
simple reference object, and the second acts as a proxy for the original object
|
||||
as much as it can.
|
||||
|
||||
|
||||
.. c:function:: int PyWeakref_Check(ob)
|
||||
|
||||
Return true if *ob* is either a reference or proxy object.
|
||||
|
||||
|
||||
.. c:function:: int PyWeakref_CheckRef(ob)
|
||||
|
||||
Return true if *ob* is a reference object.
|
||||
|
||||
|
||||
.. c:function:: int PyWeakref_CheckProxy(ob)
|
||||
|
||||
Return true if *ob* is a proxy object.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyWeakref_NewRef(PyObject *ob, PyObject *callback)
|
||||
|
||||
Return a weak reference object for the object *ob*. This will always return
|
||||
a new reference, but is not guaranteed to create a new object; an existing
|
||||
reference object may be returned. The second parameter, *callback*, can be a
|
||||
callable object that receives notification when *ob* is garbage collected; it
|
||||
should accept a single parameter, which will be the weak reference object
|
||||
itself. *callback* may also be ``None`` or *NULL*. If *ob* is not a
|
||||
weakly-referencable object, or if *callback* is not callable, ``None``, or
|
||||
*NULL*, this will return *NULL* and raise :exc:`TypeError`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
|
||||
|
||||
Return a weak reference proxy object for the object *ob*. This will always
|
||||
return a new reference, but is not guaranteed to create a new object; an
|
||||
existing proxy object may be returned. The second parameter, *callback*, can
|
||||
be a callable object that receives notification when *ob* is garbage
|
||||
collected; it should accept a single parameter, which will be the weak
|
||||
reference object itself. *callback* may also be ``None`` or *NULL*. If *ob*
|
||||
is not a weakly-referencable object, or if *callback* is not callable,
|
||||
``None``, or *NULL*, this will return *NULL* and raise :exc:`TypeError`.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyWeakref_GetObject(PyObject *ref)
|
||||
|
||||
Return the referenced object from a weak reference, *ref*. If the referent is
|
||||
no longer live, returns :const:`Py_None`.
|
||||
|
||||
.. note::
|
||||
|
||||
This function returns a **borrowed reference** to the referenced object.
|
||||
This means that you should always call :c:func:`Py_INCREF` on the object
|
||||
except if you know that it cannot be destroyed while you are still
|
||||
using it.
|
||||
|
||||
|
||||
.. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref)
|
||||
|
||||
Similar to :c:func:`PyWeakref_GetObject`, but implemented as a macro that does no
|
||||
error checking.
|
||||
31
python-3.7.4-docs-html/_sources/contents.rst.txt
Normal file
31
python-3.7.4-docs-html/_sources/contents.rst.txt
Normal file
@@ -0,0 +1,31 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
Python Documentation contents
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
.. toctree::
|
||||
|
||||
whatsnew/index.rst
|
||||
tutorial/index.rst
|
||||
using/index.rst
|
||||
reference/index.rst
|
||||
library/index.rst
|
||||
extending/index.rst
|
||||
c-api/index.rst
|
||||
distributing/index.rst
|
||||
installing/index.rst
|
||||
howto/index.rst
|
||||
faq/index.rst
|
||||
glossary.rst
|
||||
|
||||
about.rst
|
||||
bugs.rst
|
||||
copyright.rst
|
||||
license.rst
|
||||
|
||||
.. to include legacy packaging docs in build
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
||||
distutils/index.rst
|
||||
install/index.rst
|
||||
19
python-3.7.4-docs-html/_sources/copyright.rst.txt
Normal file
19
python-3.7.4-docs-html/_sources/copyright.rst.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
*********
|
||||
Copyright
|
||||
*********
|
||||
|
||||
Python and this documentation is:
|
||||
|
||||
Copyright © 2001-2019 Python Software Foundation. All rights reserved.
|
||||
|
||||
Copyright © 2000 BeOpen.com. All rights reserved.
|
||||
|
||||
Copyright © 1995-2000 Corporation for National Research Initiatives. All rights
|
||||
reserved.
|
||||
|
||||
Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved.
|
||||
|
||||
-------
|
||||
|
||||
See :ref:`history-and-license` for complete license and permissions information.
|
||||
|
||||
176
python-3.7.4-docs-html/_sources/distributing/index.rst.txt
Normal file
176
python-3.7.4-docs-html/_sources/distributing/index.rst.txt
Normal file
@@ -0,0 +1,176 @@
|
||||
.. _distributing-index:
|
||||
|
||||
###############################
|
||||
Distributing Python Modules
|
||||
###############################
|
||||
|
||||
:Email: distutils-sig@python.org
|
||||
|
||||
|
||||
As a popular open source development project, Python has an active
|
||||
supporting community of contributors and users that also make their software
|
||||
available for other Python developers to use under open source license terms.
|
||||
|
||||
This allows Python users to share and collaborate effectively, benefiting
|
||||
from the solutions others have already created to common (and sometimes
|
||||
even rare!) problems, as well as potentially contributing their own
|
||||
solutions to the common pool.
|
||||
|
||||
This guide covers the distribution part of the process. For a guide to
|
||||
installing other Python projects, refer to the
|
||||
:ref:`installation guide <installing-index>`.
|
||||
|
||||
.. note::
|
||||
|
||||
For corporate and other institutional users, be aware that many
|
||||
organisations have their own policies around using and contributing to
|
||||
open source software. Please take such policies into account when making
|
||||
use of the distribution and installation tools provided with Python.
|
||||
|
||||
|
||||
Key terms
|
||||
=========
|
||||
|
||||
* the `Python Packaging Index <https://pypi.org>`__ is a public
|
||||
repository of open source licensed packages made available for use by
|
||||
other Python users
|
||||
* the `Python Packaging Authority
|
||||
<https://www.pypa.io/>`__ are the group of
|
||||
developers and documentation authors responsible for the maintenance and
|
||||
evolution of the standard packaging tools and the associated metadata and
|
||||
file format standards. They maintain a variety of tools, documentation
|
||||
and issue trackers on both `GitHub <https://github.com/pypa>`__ and
|
||||
`BitBucket <https://bitbucket.org/pypa/>`__.
|
||||
* :mod:`distutils` is the original build and distribution system first added
|
||||
to the Python standard library in 1998. While direct use of :mod:`distutils`
|
||||
is being phased out, it still laid the foundation for the current packaging
|
||||
and distribution infrastructure, and it not only remains part of the
|
||||
standard library, but its name lives on in other ways (such as the name
|
||||
of the mailing list used to coordinate Python packaging standards
|
||||
development).
|
||||
* `setuptools`_ is a (largely) drop-in replacement for :mod:`distutils` first
|
||||
published in 2004. Its most notable addition over the unmodified
|
||||
:mod:`distutils` tools was the ability to declare dependencies on other
|
||||
packages. It is currently recommended as a more regularly updated
|
||||
alternative to :mod:`distutils` that offers consistent support for more
|
||||
recent packaging standards across a wide range of Python versions.
|
||||
* `wheel`_ (in this context) is a project that adds the ``bdist_wheel``
|
||||
command to :mod:`distutils`/`setuptools`_. This produces a cross platform
|
||||
binary packaging format (called "wheels" or "wheel files" and defined in
|
||||
:pep:`427`) that allows Python libraries, even those including binary
|
||||
extensions, to be installed on a system without needing to be built
|
||||
locally.
|
||||
|
||||
.. _setuptools: https://setuptools.readthedocs.io/en/latest/
|
||||
.. _wheel: https://wheel.readthedocs.io/
|
||||
|
||||
Open source licensing and collaboration
|
||||
=======================================
|
||||
|
||||
In most parts of the world, software is automatically covered by copyright.
|
||||
This means that other developers require explicit permission to copy, use,
|
||||
modify and redistribute the software.
|
||||
|
||||
Open source licensing is a way of explicitly granting such permission in a
|
||||
relatively consistent way, allowing developers to share and collaborate
|
||||
efficiently by making common solutions to various problems freely available.
|
||||
This leaves many developers free to spend more time focusing on the problems
|
||||
that are relatively unique to their specific situation.
|
||||
|
||||
The distribution tools provided with Python are designed to make it
|
||||
reasonably straightforward for developers to make their own contributions
|
||||
back to that common pool of software if they choose to do so.
|
||||
|
||||
The same distribution tools can also be used to distribute software within
|
||||
an organisation, regardless of whether that software is published as open
|
||||
source software or not.
|
||||
|
||||
|
||||
Installing the tools
|
||||
====================
|
||||
|
||||
The standard library does not include build tools that support modern
|
||||
Python packaging standards, as the core development team has found that it
|
||||
is important to have standard tools that work consistently, even on older
|
||||
versions of Python.
|
||||
|
||||
The currently recommended build and distribution tools can be installed
|
||||
by invoking the ``pip`` module at the command line::
|
||||
|
||||
python -m pip install setuptools wheel twine
|
||||
|
||||
.. note::
|
||||
|
||||
For POSIX users (including Mac OS X and Linux users), these instructions
|
||||
assume the use of a :term:`virtual environment`.
|
||||
|
||||
For Windows users, these instructions assume that the option to
|
||||
adjust the system PATH environment variable was selected when installing
|
||||
Python.
|
||||
|
||||
The Python Packaging User Guide includes more details on the `currently
|
||||
recommended tools`_.
|
||||
|
||||
.. _currently recommended tools: https://packaging.python.org/guides/tool-recommendations/#packaging-tool-recommendations
|
||||
|
||||
.. index::
|
||||
single: Python Package Index (PyPI)
|
||||
single: PyPI; (see Python Package Index (PyPI))
|
||||
|
||||
.. _publishing-python-packages:
|
||||
|
||||
Reading the Python Packaging User Guide
|
||||
=======================================
|
||||
|
||||
The Python Packaging User Guide covers the various key steps and elements
|
||||
involved in creating and publishing a project:
|
||||
|
||||
* `Project structure`_
|
||||
* `Building and packaging the project`_
|
||||
* `Uploading the project to the Python Packaging Index`_
|
||||
|
||||
.. _Project structure: \
|
||||
https://packaging.python.org/tutorials/distributing-packages/
|
||||
.. _Building and packaging the project: \
|
||||
https://packaging.python.org/tutorials/distributing-packages/#packaging-your-project
|
||||
.. _Uploading the project to the Python Packaging Index: \
|
||||
https://packaging.python.org/tutorials/distributing-packages/#uploading-your-project-to-pypi
|
||||
|
||||
|
||||
How do I...?
|
||||
============
|
||||
|
||||
These are quick answers or links for some common tasks.
|
||||
|
||||
... choose a name for my project?
|
||||
---------------------------------
|
||||
|
||||
This isn't an easy topic, but here are a few tips:
|
||||
|
||||
* check the Python Packaging Index to see if the name is already in use
|
||||
* check popular hosting sites like GitHub, BitBucket, etc to see if there
|
||||
is already a project with that name
|
||||
* check what comes up in a web search for the name you're considering
|
||||
* avoid particularly common words, especially ones with multiple meanings,
|
||||
as they can make it difficult for users to find your software when
|
||||
searching for it
|
||||
|
||||
|
||||
... create and distribute binary extensions?
|
||||
--------------------------------------------
|
||||
|
||||
This is actually quite a complex topic, with a variety of alternatives
|
||||
available depending on exactly what you're aiming to achieve. See the
|
||||
Python Packaging User Guide for more information and recommendations.
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Python Packaging User Guide: Binary Extensions
|
||||
<https://packaging.python.org/guides/packaging-binary-extensions/>`__
|
||||
|
||||
.. other topics:
|
||||
|
||||
Once the Development & Deployment part of PPUG is fleshed out, some of
|
||||
those sections should be linked from new questions here (most notably,
|
||||
we should have a question about avoiding depending on PyPI that links to
|
||||
https://packaging.python.org/en/latest/mirrors/)
|
||||
2031
python-3.7.4-docs-html/_sources/distutils/apiref.rst.txt
Normal file
2031
python-3.7.4-docs-html/_sources/distutils/apiref.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
459
python-3.7.4-docs-html/_sources/distutils/builtdist.rst.txt
Normal file
459
python-3.7.4-docs-html/_sources/distutils/builtdist.rst.txt
Normal file
@@ -0,0 +1,459 @@
|
||||
.. _built-dist:
|
||||
|
||||
****************************
|
||||
Creating Built Distributions
|
||||
****************************
|
||||
|
||||
A "built distribution" is what you're probably used to thinking of either as a
|
||||
"binary package" or an "installer" (depending on your background). It's not
|
||||
necessarily binary, though, because it might contain only Python source code
|
||||
and/or byte-code; and we don't call it a package, because that word is already
|
||||
spoken for in Python. (And "installer" is a term specific to the world of
|
||||
mainstream desktop systems.)
|
||||
|
||||
A built distribution is how you make life as easy as possible for installers of
|
||||
your module distribution: for users of RPM-based Linux systems, it's a binary
|
||||
RPM; for Windows users, it's an executable installer; for Debian-based Linux
|
||||
users, it's a Debian package; and so forth. Obviously, no one person will be
|
||||
able to create built distributions for every platform under the sun, so the
|
||||
Distutils are designed to enable module developers to concentrate on their
|
||||
specialty---writing code and creating source distributions---while an
|
||||
intermediary species called *packagers* springs up to turn source distributions
|
||||
into built distributions for as many platforms as there are packagers.
|
||||
|
||||
Of course, the module developer could be their own packager; or the packager could
|
||||
be a volunteer "out there" somewhere who has access to a platform which the
|
||||
original developer does not; or it could be software periodically grabbing new
|
||||
source distributions and turning them into built distributions for as many
|
||||
platforms as the software has access to. Regardless of who they are, a packager
|
||||
uses the setup script and the :command:`bdist` command family to generate built
|
||||
distributions.
|
||||
|
||||
As a simple example, if I run the following command in the Distutils source
|
||||
tree::
|
||||
|
||||
python setup.py bdist
|
||||
|
||||
then the Distutils builds my module distribution (the Distutils itself in this
|
||||
case), does a "fake" installation (also in the :file:`build` directory), and
|
||||
creates the default type of built distribution for my platform. The default
|
||||
format for built distributions is a "dumb" tar file on Unix, and a simple
|
||||
executable installer on Windows. (That tar file is considered "dumb" because it
|
||||
has to be unpacked in a specific location to work.)
|
||||
|
||||
Thus, the above command on a Unix system creates
|
||||
:file:`Distutils-1.0.{plat}.tar.gz`; unpacking this tarball from the right place
|
||||
installs the Distutils just as though you had downloaded the source distribution
|
||||
and run ``python setup.py install``. (The "right place" is either the root of
|
||||
the filesystem or Python's :file:`{prefix}` directory, depending on the options
|
||||
given to the :command:`bdist_dumb` command; the default is to make dumb
|
||||
distributions relative to :file:`{prefix}`.)
|
||||
|
||||
Obviously, for pure Python distributions, this isn't any simpler than just
|
||||
running ``python setup.py install``\ ---but for non-pure distributions, which
|
||||
include extensions that would need to be compiled, it can mean the difference
|
||||
between someone being able to use your extensions or not. And creating "smart"
|
||||
built distributions, such as an RPM package or an executable installer for
|
||||
Windows, is far more convenient for users even if your distribution doesn't
|
||||
include any extensions.
|
||||
|
||||
The :command:`bdist` command has a :option:`!--formats` option, similar to the
|
||||
:command:`sdist` command, which you can use to select the types of built
|
||||
distribution to generate: for example, ::
|
||||
|
||||
python setup.py bdist --format=zip
|
||||
|
||||
would, when run on a Unix system, create
|
||||
:file:`Distutils-1.0.{plat}.zip`\ ---again, this archive would be unpacked
|
||||
from the root directory to install the Distutils.
|
||||
|
||||
The available formats for built distributions are:
|
||||
|
||||
+-------------+------------------------------+---------+
|
||||
| Format | Description | Notes |
|
||||
+=============+==============================+=========+
|
||||
| ``gztar`` | gzipped tar file | \(1) |
|
||||
| | (:file:`.tar.gz`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``bztar`` | bzipped tar file | |
|
||||
| | (:file:`.tar.bz2`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``xztar`` | xzipped tar file | |
|
||||
| | (:file:`.tar.xz`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``ztar`` | compressed tar file | \(3) |
|
||||
| | (:file:`.tar.Z`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``tar`` | tar file (:file:`.tar`) | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``zip`` | zip file (:file:`.zip`) | (2),(4) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``rpm`` | RPM | \(5) |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``pkgtool`` | Solaris :program:`pkgtool` | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``sdux`` | HP-UX :program:`swinstall` | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``wininst`` | self-extracting ZIP file for | \(4) |
|
||||
| | Windows | |
|
||||
+-------------+------------------------------+---------+
|
||||
| ``msi`` | Microsoft Installer. | |
|
||||
+-------------+------------------------------+---------+
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Added support for the ``xztar`` format.
|
||||
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
default on Unix
|
||||
|
||||
(2)
|
||||
default on Windows
|
||||
|
||||
(3)
|
||||
requires external :program:`compress` utility.
|
||||
|
||||
(4)
|
||||
requires either external :program:`zip` utility or :mod:`zipfile` module (part
|
||||
of the standard Python library since Python 1.6)
|
||||
|
||||
(5)
|
||||
requires external :program:`rpm` utility, version 3.0.4 or better (use ``rpm
|
||||
--version`` to find out which version you have)
|
||||
|
||||
You don't have to use the :command:`bdist` command with the :option:`!--formats`
|
||||
option; you can also use the command that directly implements the format you're
|
||||
interested in. Some of these :command:`bdist` "sub-commands" actually generate
|
||||
several similar formats; for instance, the :command:`bdist_dumb` command
|
||||
generates all the "dumb" archive formats (``tar``, ``gztar``, ``bztar``,
|
||||
``xztar``, ``ztar``, and ``zip``), and :command:`bdist_rpm` generates both
|
||||
binary and source RPMs. The :command:`bdist` sub-commands, and the formats
|
||||
generated by each, are:
|
||||
|
||||
+--------------------------+-------------------------------------+
|
||||
| Command | Formats |
|
||||
+==========================+=====================================+
|
||||
| :command:`bdist_dumb` | tar, gztar, bztar, xztar, ztar, zip |
|
||||
+--------------------------+-------------------------------------+
|
||||
| :command:`bdist_rpm` | rpm, srpm |
|
||||
+--------------------------+-------------------------------------+
|
||||
| :command:`bdist_wininst` | wininst |
|
||||
+--------------------------+-------------------------------------+
|
||||
| :command:`bdist_msi` | msi |
|
||||
+--------------------------+-------------------------------------+
|
||||
|
||||
The following sections give details on the individual :command:`bdist_\*`
|
||||
commands.
|
||||
|
||||
|
||||
.. .. _creating-dumb:
|
||||
|
||||
.. Creating dumb built distributions
|
||||
.. =================================
|
||||
|
||||
.. XXX Need to document absolute vs. prefix-relative packages here, but first
|
||||
I have to implement it!
|
||||
|
||||
|
||||
.. _creating-rpms:
|
||||
|
||||
Creating RPM packages
|
||||
=====================
|
||||
|
||||
The RPM format is used by many popular Linux distributions, including Red Hat,
|
||||
SuSE, and Mandrake. If one of these (or any of the other RPM-based Linux
|
||||
distributions) is your usual environment, creating RPM packages for other users
|
||||
of that same distribution is trivial. Depending on the complexity of your module
|
||||
distribution and differences between Linux distributions, you may also be able
|
||||
to create RPMs that work on different RPM-based distributions.
|
||||
|
||||
The usual way to create an RPM of your module distribution is to run the
|
||||
:command:`bdist_rpm` command::
|
||||
|
||||
python setup.py bdist_rpm
|
||||
|
||||
or the :command:`bdist` command with the :option:`!--format` option::
|
||||
|
||||
python setup.py bdist --formats=rpm
|
||||
|
||||
The former allows you to specify RPM-specific options; the latter allows you to
|
||||
easily specify multiple formats in one run. If you need to do both, you can
|
||||
explicitly specify multiple :command:`bdist_\*` commands and their options::
|
||||
|
||||
python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>" \
|
||||
bdist_wininst --target-version="2.0"
|
||||
|
||||
Creating RPM packages is driven by a :file:`.spec` file, much as using the
|
||||
Distutils is driven by the setup script. To make your life easier, the
|
||||
:command:`bdist_rpm` command normally creates a :file:`.spec` file based on the
|
||||
information you supply in the setup script, on the command line, and in any
|
||||
Distutils configuration files. Various options and sections in the
|
||||
:file:`.spec` file are derived from options in the setup script as follows:
|
||||
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| RPM :file:`.spec` file option or section | Distutils setup script option |
|
||||
+==========================================+==============================================+
|
||||
| Name | ``name`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Summary (in preamble) | ``description`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Version | ``version`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Vendor | ``author`` and ``author_email``, |
|
||||
| | or --- & ``maintainer`` and |
|
||||
| | ``maintainer_email`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Copyright | ``license`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| Url | ``url`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
| %description (section) | ``long_description`` |
|
||||
+------------------------------------------+----------------------------------------------+
|
||||
|
||||
Additionally, there are many options in :file:`.spec` files that don't have
|
||||
corresponding options in the setup script. Most of these are handled through
|
||||
options to the :command:`bdist_rpm` command as follows:
|
||||
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| RPM :file:`.spec` file option | :command:`bdist_rpm` option | default value |
|
||||
| or section | | |
|
||||
+===============================+=============================+=========================+
|
||||
| Release | ``release`` | "1" |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Group | ``group`` | "Development/Libraries" |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Vendor | ``vendor`` | (see above) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Packager | ``packager`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Provides | ``provides`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Requires | ``requires`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Conflicts | ``conflicts`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Obsoletes | ``obsoletes`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Distribution | ``distribution_name`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| BuildRequires | ``build_requires`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
| Icon | ``icon`` | (none) |
|
||||
+-------------------------------+-----------------------------+-------------------------+
|
||||
|
||||
Obviously, supplying even a few of these options on the command-line would be
|
||||
tedious and error-prone, so it's usually best to put them in the setup
|
||||
configuration file, :file:`setup.cfg`\ ---see section :ref:`setup-config`. If
|
||||
you distribute or package many Python module distributions, you might want to
|
||||
put options that apply to all of them in your personal Distutils configuration
|
||||
file (:file:`~/.pydistutils.cfg`). If you want to temporarily disable
|
||||
this file, you can pass the :option:`!--no-user-cfg` option to :file:`setup.py`.
|
||||
|
||||
There are three steps to building a binary RPM package, all of which are
|
||||
handled automatically by the Distutils:
|
||||
|
||||
#. create a :file:`.spec` file, which describes the package (analogous to the
|
||||
Distutils setup script; in fact, much of the information in the setup script
|
||||
winds up in the :file:`.spec` file)
|
||||
|
||||
#. create the source RPM
|
||||
|
||||
#. create the "binary" RPM (which may or may not contain binary code, depending
|
||||
on whether your module distribution contains Python extensions)
|
||||
|
||||
Normally, RPM bundles the last two steps together; when you use the Distutils,
|
||||
all three steps are typically bundled together.
|
||||
|
||||
If you wish, you can separate these three steps. You can use the
|
||||
:option:`!--spec-only` option to make :command:`bdist_rpm` just create the
|
||||
:file:`.spec` file and exit; in this case, the :file:`.spec` file will be
|
||||
written to the "distribution directory"---normally :file:`dist/`, but
|
||||
customizable with the :option:`!--dist-dir` option. (Normally, the :file:`.spec`
|
||||
file winds up deep in the "build tree," in a temporary directory created by
|
||||
:command:`bdist_rpm`.)
|
||||
|
||||
.. % \XXX{this isn't implemented yet---is it needed?!}
|
||||
.. % You can also specify a custom \file{.spec} file with the
|
||||
.. % \longprogramopt{spec-file} option; used in conjunction with
|
||||
.. % \longprogramopt{spec-only}, this gives you an opportunity to customize
|
||||
.. % the \file{.spec} file manually:
|
||||
.. %
|
||||
.. % \ begin{verbatim}
|
||||
.. % > python setup.py bdist_rpm --spec-only
|
||||
.. % # ...edit dist/FooBar-1.0.spec
|
||||
.. % > python setup.py bdist_rpm --spec-file=dist/FooBar-1.0.spec
|
||||
.. % \ end{verbatim}
|
||||
.. %
|
||||
.. % (Although a better way to do this is probably to override the standard
|
||||
.. % \command{bdist\_rpm} command with one that writes whatever else you want
|
||||
.. % to the \file{.spec} file.)
|
||||
|
||||
|
||||
.. _creating-wininst:
|
||||
|
||||
Creating Windows Installers
|
||||
===========================
|
||||
|
||||
Executable installers are the natural format for binary distributions on
|
||||
Windows. They display a nice graphical user interface, display some information
|
||||
about the module distribution to be installed taken from the metadata in the
|
||||
setup script, let the user select a few options, and start or cancel the
|
||||
installation.
|
||||
|
||||
Since the metadata is taken from the setup script, creating Windows installers
|
||||
is usually as easy as running::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
|
||||
or the :command:`bdist` command with the :option:`!--formats` option::
|
||||
|
||||
python setup.py bdist --formats=wininst
|
||||
|
||||
If you have a pure module distribution (only containing pure Python modules and
|
||||
packages), the resulting installer will be version independent and have a name
|
||||
like :file:`foo-1.0.win32.exe`. Note that creating ``wininst`` binary
|
||||
distributions in only supported on Windows systems.
|
||||
|
||||
If you have a non-pure distribution, the extensions can only be created on a
|
||||
Windows platform, and will be Python version dependent. The installer filename
|
||||
will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`. You
|
||||
have to create a separate installer for every Python version you want to
|
||||
support.
|
||||
|
||||
The installer will try to compile pure modules into :term:`bytecode` after installation
|
||||
on the target system in normal and optimizing mode. If you don't want this to
|
||||
happen for some reason, you can run the :command:`bdist_wininst` command with
|
||||
the :option:`!--no-target-compile` and/or the :option:`!--no-target-optimize`
|
||||
option.
|
||||
|
||||
By default the installer will display the cool "Python Powered" logo when it is
|
||||
run, but you can also supply your own 152x261 bitmap which must be a Windows
|
||||
:file:`.bmp` file with the :option:`!--bitmap` option.
|
||||
|
||||
The installer will also display a large title on the desktop background window
|
||||
when it is run, which is constructed from the name of your distribution and the
|
||||
version number. This can be changed to another text by using the
|
||||
:option:`!--title` option.
|
||||
|
||||
The installer file will be written to the "distribution directory" --- normally
|
||||
:file:`dist/`, but customizable with the :option:`!--dist-dir` option.
|
||||
|
||||
.. _cross-compile-windows:
|
||||
|
||||
Cross-compiling on Windows
|
||||
==========================
|
||||
|
||||
Starting with Python 2.6, distutils is capable of cross-compiling between
|
||||
Windows platforms. In practice, this means that with the correct tools
|
||||
installed, you can use a 32bit version of Windows to create 64bit extensions
|
||||
and vice-versa.
|
||||
|
||||
To build for an alternate platform, specify the :option:`!--plat-name` option
|
||||
to the build command. Valid values are currently 'win32', and 'win-amd64'.
|
||||
For example, on a 32bit version of Windows, you could execute::
|
||||
|
||||
python setup.py build --plat-name=win-amd64
|
||||
|
||||
to build a 64bit version of your extension. The Windows Installers also
|
||||
support this option, so the command::
|
||||
|
||||
python setup.py build --plat-name=win-amd64 bdist_wininst
|
||||
|
||||
would create a 64bit installation executable on your 32bit version of Windows.
|
||||
|
||||
To cross-compile, you must download the Python source code and cross-compile
|
||||
Python itself for the platform you are targeting - it is not possible from a
|
||||
binary installation of Python (as the .lib etc file for other platforms are
|
||||
not included.) In practice, this means the user of a 32 bit operating
|
||||
system will need to use Visual Studio 2008 to open the
|
||||
:file:`PCbuild/PCbuild.sln` solution in the Python source tree and build the
|
||||
"x64" configuration of the 'pythoncore' project before cross-compiling
|
||||
extensions is possible.
|
||||
|
||||
Note that by default, Visual Studio 2008 does not install 64bit compilers or
|
||||
tools. You may need to reexecute the Visual Studio setup process and select
|
||||
these tools (using Control Panel->[Add/Remove] Programs is a convenient way to
|
||||
check or modify your existing install.)
|
||||
|
||||
.. _postinstallation-script:
|
||||
|
||||
The Postinstallation script
|
||||
---------------------------
|
||||
|
||||
Starting with Python 2.3, a postinstallation script can be specified with the
|
||||
:option:`!--install-script` option. The basename of the script must be
|
||||
specified, and the script filename must also be listed in the scripts argument
|
||||
to the setup function.
|
||||
|
||||
This script will be run at installation time on the target system after all the
|
||||
files have been copied, with ``argv[1]`` set to :option:`!-install`, and again at
|
||||
uninstallation time before the files are removed with ``argv[1]`` set to
|
||||
:option:`!-remove`.
|
||||
|
||||
The installation script runs embedded in the windows installer, every output
|
||||
(``sys.stdout``, ``sys.stderr``) is redirected into a buffer and will be
|
||||
displayed in the GUI after the script has finished.
|
||||
|
||||
Some functions especially useful in this context are available as additional
|
||||
built-in functions in the installation script.
|
||||
|
||||
|
||||
.. function:: directory_created(path)
|
||||
file_created(path)
|
||||
|
||||
These functions should be called when a directory or file is created by the
|
||||
postinstall script at installation time. It will register *path* with the
|
||||
uninstaller, so that it will be removed when the distribution is uninstalled.
|
||||
To be safe, directories are only removed if they are empty.
|
||||
|
||||
|
||||
.. function:: get_special_folder_path(csidl_string)
|
||||
|
||||
This function can be used to retrieve special folder locations on Windows like
|
||||
the Start Menu or the Desktop. It returns the full path to the folder.
|
||||
*csidl_string* must be one of the following strings::
|
||||
|
||||
"CSIDL_APPDATA"
|
||||
|
||||
"CSIDL_COMMON_STARTMENU"
|
||||
"CSIDL_STARTMENU"
|
||||
|
||||
"CSIDL_COMMON_DESKTOPDIRECTORY"
|
||||
"CSIDL_DESKTOPDIRECTORY"
|
||||
|
||||
"CSIDL_COMMON_STARTUP"
|
||||
"CSIDL_STARTUP"
|
||||
|
||||
"CSIDL_COMMON_PROGRAMS"
|
||||
"CSIDL_PROGRAMS"
|
||||
|
||||
"CSIDL_FONTS"
|
||||
|
||||
If the folder cannot be retrieved, :exc:`OSError` is raised.
|
||||
|
||||
Which folders are available depends on the exact Windows version, and probably
|
||||
also the configuration. For details refer to Microsoft's documentation of the
|
||||
:c:func:`SHGetSpecialFolderPath` function.
|
||||
|
||||
|
||||
.. function:: create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])
|
||||
|
||||
This function creates a shortcut. *target* is the path to the program to be
|
||||
started by the shortcut. *description* is the description of the shortcut.
|
||||
*filename* is the title of the shortcut that the user will see. *arguments*
|
||||
specifies the command line arguments, if any. *workdir* is the working directory
|
||||
for the program. *iconpath* is the file containing the icon for the shortcut,
|
||||
and *iconindex* is the index of the icon in the file *iconpath*. Again, for
|
||||
details consult the Microsoft documentation for the :class:`IShellLink`
|
||||
interface.
|
||||
|
||||
|
||||
Vista User Access Control (UAC)
|
||||
===============================
|
||||
|
||||
Starting with Python 2.6, bdist_wininst supports a :option:`!--user-access-control`
|
||||
option. The default is 'none' (meaning no UAC handling is done), and other
|
||||
valid values are 'auto' (meaning prompt for UAC elevation if Python was
|
||||
installed for all users) and 'force' (meaning always prompt for elevation).
|
||||
104
python-3.7.4-docs-html/_sources/distutils/commandref.rst.txt
Normal file
104
python-3.7.4-docs-html/_sources/distutils/commandref.rst.txt
Normal file
@@ -0,0 +1,104 @@
|
||||
.. _reference:
|
||||
|
||||
*****************
|
||||
Command Reference
|
||||
*****************
|
||||
|
||||
.. % \section{Building modules: the \protect\command{build} command family}
|
||||
.. % \label{build-cmds}
|
||||
.. % \subsubsection{\protect\command{build}}
|
||||
.. % \label{build-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_py}}
|
||||
.. % \label{build-py-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_ext}}
|
||||
.. % \label{build-ext-cmd}
|
||||
.. % \subsubsection{\protect\command{build\_clib}}
|
||||
.. % \label{build-clib-cmd}
|
||||
|
||||
|
||||
.. _install-cmd:
|
||||
|
||||
Installing modules: the :command:`install` command family
|
||||
=========================================================
|
||||
|
||||
The install command ensures that the build commands have been run and then runs
|
||||
the subcommands :command:`install_lib`, :command:`install_data` and
|
||||
:command:`install_scripts`.
|
||||
|
||||
.. % \subsubsection{\protect\command{install\_lib}}
|
||||
.. % \label{install-lib-cmd}
|
||||
|
||||
|
||||
.. _install-data-cmd:
|
||||
|
||||
:command:`install_data`
|
||||
-----------------------
|
||||
|
||||
This command installs all data files provided with the distribution.
|
||||
|
||||
|
||||
.. _install-scripts-cmd:
|
||||
|
||||
:command:`install_scripts`
|
||||
--------------------------
|
||||
|
||||
This command installs all (Python) scripts in the distribution.
|
||||
|
||||
.. % \subsection{Cleaning up: the \protect\command{clean} command}
|
||||
.. % \label{clean-cmd}
|
||||
|
||||
|
||||
.. _sdist-cmd:
|
||||
|
||||
Creating a source distribution: the :command:`sdist` command
|
||||
============================================================
|
||||
|
||||
.. XXX fragment moved down from above: needs context!
|
||||
|
||||
The manifest template commands are:
|
||||
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| Command | Description |
|
||||
+===========================================+===============================================+
|
||||
| :command:`include pat1 pat2 ...` | include all files matching any of the listed |
|
||||
| | patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`exclude pat1 pat2 ...` | exclude all files matching any of the listed |
|
||||
| | patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`recursive-include dir pat1 pat2 | include all files under *dir* matching any of |
|
||||
| ...` | the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`recursive-exclude dir pat1 pat2 | exclude all files under *dir* matching any of |
|
||||
| ...` | the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`global-include pat1 pat2 ...` | include all files anywhere in the source tree |
|
||||
| | matching --- & any of the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`global-exclude pat1 pat2 ...` | exclude all files anywhere in the source tree |
|
||||
| | matching --- & any of the listed patterns |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`prune dir` | exclude all files under *dir* |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
| :command:`graft dir` | include all files under *dir* |
|
||||
+-------------------------------------------+-----------------------------------------------+
|
||||
|
||||
The patterns here are Unix-style "glob" patterns: ``*`` matches any sequence of
|
||||
regular filename characters, ``?`` matches any single regular filename
|
||||
character, and ``[range]`` matches any of the characters in *range* (e.g.,
|
||||
``a-z``, ``a-zA-Z``, ``a-f0-9_.``). The definition of "regular filename
|
||||
character" is platform-specific: on Unix it is anything except slash; on Windows
|
||||
anything except backslash or colon.
|
||||
|
||||
.. XXX Windows support not there yet
|
||||
|
||||
.. % \section{Creating a built distribution: the
|
||||
.. % \protect\command{bdist} command family}
|
||||
.. % \label{bdist-cmds}
|
||||
|
||||
.. % \subsection{\protect\command{bdist}}
|
||||
.. % \subsection{\protect\command{bdist\_dumb}}
|
||||
.. % \subsection{\protect\command{bdist\_rpm}}
|
||||
.. % \subsection{\protect\command{bdist\_wininst}}
|
||||
|
||||
|
||||
142
python-3.7.4-docs-html/_sources/distutils/configfile.rst.txt
Normal file
142
python-3.7.4-docs-html/_sources/distutils/configfile.rst.txt
Normal file
@@ -0,0 +1,142 @@
|
||||
.. _setup-config:
|
||||
|
||||
************************************
|
||||
Writing the Setup Configuration File
|
||||
************************************
|
||||
|
||||
Often, it's not possible to write down everything needed to build a distribution
|
||||
*a priori*: you may need to get some information from the user, or from the
|
||||
user's system, in order to proceed. As long as that information is fairly
|
||||
simple---a list of directories to search for C header files or libraries, for
|
||||
example---then providing a configuration file, :file:`setup.cfg`, for users to
|
||||
edit is a cheap and easy way to solicit it. Configuration files also let you
|
||||
provide default values for any command option, which the installer can then
|
||||
override either on the command-line or by editing the config file.
|
||||
|
||||
The setup configuration file is a useful middle-ground between the setup
|
||||
script---which, ideally, would be opaque to installers [#]_---and the command-line to
|
||||
the setup script, which is outside of your control and entirely up to the
|
||||
installer. In fact, :file:`setup.cfg` (and any other Distutils configuration
|
||||
files present on the target system) are processed after the contents of the
|
||||
setup script, but before the command-line. This has several useful
|
||||
consequences:
|
||||
|
||||
.. % (If you have more advanced needs, such as determining which extensions
|
||||
.. % to build based on what capabilities are present on the target system,
|
||||
.. % then you need the Distutils ``auto-configuration'' facility. This
|
||||
.. % started to appear in Distutils 0.9 but, as of this writing, isn't mature
|
||||
.. % or stable enough yet for real-world use.)
|
||||
|
||||
* installers can override some of what you put in :file:`setup.py` by editing
|
||||
:file:`setup.cfg`
|
||||
|
||||
* you can provide non-standard defaults for options that are not easily set in
|
||||
:file:`setup.py`
|
||||
|
||||
* installers can override anything in :file:`setup.cfg` using the command-line
|
||||
options to :file:`setup.py`
|
||||
|
||||
The basic syntax of the configuration file is simple:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[command]
|
||||
option=value
|
||||
...
|
||||
|
||||
where *command* is one of the Distutils commands (e.g. :command:`build_py`,
|
||||
:command:`install`), and *option* is one of the options that command supports.
|
||||
Any number of options can be supplied for each command, and any number of
|
||||
command sections can be included in the file. Blank lines are ignored, as are
|
||||
comments, which run from a ``'#'`` character until the end of the line. Long
|
||||
option values can be split across multiple lines simply by indenting the
|
||||
continuation lines.
|
||||
|
||||
You can find out the list of options supported by a particular command with the
|
||||
universal :option:`!--help` option, e.g.
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python setup.py --help build_ext
|
||||
[...]
|
||||
Options for 'build_ext' command:
|
||||
--build-lib (-b) directory for compiled extension modules
|
||||
--build-temp (-t) directory for temporary files (build by-products)
|
||||
--inplace (-i) ignore build-lib and put compiled extensions into the
|
||||
source directory alongside your pure Python modules
|
||||
--include-dirs (-I) list of directories to search for header files
|
||||
--define (-D) C preprocessor macros to define
|
||||
--undef (-U) C preprocessor macros to undefine
|
||||
--swig-opts list of SWIG command line options
|
||||
[...]
|
||||
|
||||
Note that an option spelled :option:`!--foo-bar` on the command-line is spelled
|
||||
``foo_bar`` in configuration files.
|
||||
|
||||
.. _distutils-build-ext-inplace:
|
||||
|
||||
For example, say you want your extensions to be built "in-place"---that is, you
|
||||
have an extension :mod:`pkg.ext`, and you want the compiled extension file
|
||||
(:file:`ext.so` on Unix, say) to be put in the same source directory as your
|
||||
pure Python modules :mod:`pkg.mod1` and :mod:`pkg.mod2`. You can always use the
|
||||
:option:`!--inplace` option on the command-line to ensure this:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
python setup.py build_ext --inplace
|
||||
|
||||
But this requires that you always specify the :command:`build_ext` command
|
||||
explicitly, and remember to provide :option:`!--inplace`. An easier way is to
|
||||
"set and forget" this option, by encoding it in :file:`setup.cfg`, the
|
||||
configuration file for this distribution:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[build_ext]
|
||||
inplace=1
|
||||
|
||||
This will affect all builds of this module distribution, whether or not you
|
||||
explicitly specify :command:`build_ext`. If you include :file:`setup.cfg` in
|
||||
your source distribution, it will also affect end-user builds---which is
|
||||
probably a bad idea for this option, since always building extensions in-place
|
||||
would break installation of the module distribution. In certain peculiar cases,
|
||||
though, modules are built right in their installation directory, so this is
|
||||
conceivably a useful ability. (Distributing extensions that expect to be built
|
||||
in their installation directory is almost always a bad idea, though.)
|
||||
|
||||
Another example: certain commands take a lot of options that don't change from
|
||||
run to run; for example, :command:`bdist_rpm` needs to know everything required
|
||||
to generate a "spec" file for creating an RPM distribution. Some of this
|
||||
information comes from the setup script, and some is automatically generated by
|
||||
the Distutils (such as the list of files installed). But some of it has to be
|
||||
supplied as options to :command:`bdist_rpm`, which would be very tedious to do
|
||||
on the command-line for every run. Hence, here is a snippet from the Distutils'
|
||||
own :file:`setup.cfg`:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[bdist_rpm]
|
||||
release = 1
|
||||
packager = Greg Ward <gward@python.net>
|
||||
doc_files = CHANGES.txt
|
||||
README.txt
|
||||
USAGE.txt
|
||||
doc/
|
||||
examples/
|
||||
|
||||
Note that the ``doc_files`` option is simply a whitespace-separated string
|
||||
split across multiple lines for readability.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`inst-config-syntax` in "Installing Python Modules"
|
||||
More information on the configuration files is available in the manual for
|
||||
system administrators.
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] This ideal probably won't be achieved until auto-configuration is fully
|
||||
supported by the Distutils.
|
||||
|
||||
338
python-3.7.4-docs-html/_sources/distutils/examples.rst.txt
Normal file
338
python-3.7.4-docs-html/_sources/distutils/examples.rst.txt
Normal file
@@ -0,0 +1,338 @@
|
||||
.. _examples:
|
||||
|
||||
********
|
||||
Examples
|
||||
********
|
||||
|
||||
This chapter provides a number of basic examples to help get started with
|
||||
distutils. Additional information about using distutils can be found in the
|
||||
Distutils Cookbook.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Distutils Cookbook <https://wiki.python.org/moin/Distutils/Cookbook>`_
|
||||
Collection of recipes showing how to achieve more control over distutils.
|
||||
|
||||
|
||||
.. _pure-mod:
|
||||
|
||||
Pure Python distribution (by module)
|
||||
====================================
|
||||
|
||||
If you're just distributing a couple of modules, especially if they don't live
|
||||
in a particular package, you can specify them individually using the
|
||||
``py_modules`` option in the setup script.
|
||||
|
||||
In the simplest case, you'll have two files to worry about: a setup script and
|
||||
the single module you're distributing, :file:`foo.py` in this example::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.py
|
||||
|
||||
(In all diagrams in this section, *<root>* will refer to the distribution root
|
||||
directory.) A minimal setup script to describe this situation would be::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Note that the name of the distribution is specified independently with the
|
||||
``name`` option, and there's no rule that says it has to be the same as
|
||||
the name of the sole module in the distribution (although that's probably a good
|
||||
convention to follow). However, the distribution name is used to generate
|
||||
filenames, so you should stick to letters, digits, underscores, and hyphens.
|
||||
|
||||
Since ``py_modules`` is a list, you can of course specify multiple
|
||||
modules, eg. if you're distributing modules :mod:`foo` and :mod:`bar`, your
|
||||
setup might look like this::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
and the setup script might be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
py_modules=['foo', 'bar'],
|
||||
)
|
||||
|
||||
You can put module source files into another directory, but if you have enough
|
||||
modules to do that, it's probably easier to specify modules by package rather
|
||||
than listing them individually.
|
||||
|
||||
|
||||
.. _pure-pkg:
|
||||
|
||||
Pure Python distribution (by package)
|
||||
=====================================
|
||||
|
||||
If you have more than a couple of modules to distribute, especially if they are
|
||||
in multiple packages, it's probably easier to specify whole packages rather than
|
||||
individual modules. This works even if your modules are not in a package; you
|
||||
can just tell the Distutils to process modules from the root package, and that
|
||||
works the same as any other package (except that you don't have to have an
|
||||
:file:`__init__.py` file).
|
||||
|
||||
The setup script from the last example could also be written as ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=[''],
|
||||
)
|
||||
|
||||
(The empty string stands for the root package.)
|
||||
|
||||
If those two files are moved into a subdirectory, but remain in the root
|
||||
package, e.g.::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
src/ foo.py
|
||||
bar.py
|
||||
|
||||
then you would still specify the root package, but you have to tell the
|
||||
Distutils where source files in the root package live::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'': 'src'},
|
||||
packages=[''],
|
||||
)
|
||||
|
||||
More typically, though, you will want to distribute multiple modules in the same
|
||||
package (or in sub-packages). For example, if the :mod:`foo` and :mod:`bar`
|
||||
modules belong in package :mod:`foobar`, one way to layout your source tree is
|
||||
::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foobar/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
This is in fact the default layout expected by the Distutils, and the one that
|
||||
requires the least work to describe in your setup script::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
If you want to put modules in directories not named for their package, then you
|
||||
need to use the ``package_dir`` option again. For example, if the
|
||||
:file:`src` directory holds modules in the :mod:`foobar` package::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
src/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
an appropriate setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'foobar': 'src'},
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
Or, you might put modules from your main package right in the distribution
|
||||
root::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
|
||||
in which case your setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
package_dir={'foobar': ''},
|
||||
packages=['foobar'],
|
||||
)
|
||||
|
||||
(The empty string also stands for the current directory.)
|
||||
|
||||
If you have sub-packages, they must be explicitly listed in ``packages``,
|
||||
but any entries in ``package_dir`` automatically extend to sub-packages.
|
||||
(In other words, the Distutils does *not* scan your source tree, trying to
|
||||
figure out which directories correspond to Python packages by looking for
|
||||
:file:`__init__.py` files.) Thus, if the default layout grows a sub-package::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foobar/
|
||||
__init__.py
|
||||
foo.py
|
||||
bar.py
|
||||
subfoo/
|
||||
__init__.py
|
||||
blah.py
|
||||
|
||||
then the corresponding setup script would be ::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
packages=['foobar', 'foobar.subfoo'],
|
||||
)
|
||||
|
||||
|
||||
.. _single-ext:
|
||||
|
||||
Single extension module
|
||||
=======================
|
||||
|
||||
Extension modules are specified using the ``ext_modules`` option.
|
||||
``package_dir`` has no effect on where extension source files are found;
|
||||
it only affects the source for pure Python modules. The simplest case, a
|
||||
single extension module in a single C source file, is::
|
||||
|
||||
<root>/
|
||||
setup.py
|
||||
foo.c
|
||||
|
||||
If the :mod:`foo` extension belongs in the root package, the setup script for
|
||||
this could be ::
|
||||
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
If the extension actually belongs in a package, say :mod:`foopkg`, then
|
||||
|
||||
With exactly the same source tree layout, this extension can be put in the
|
||||
:mod:`foopkg` package simply by changing the name of the extension::
|
||||
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
setup(name='foobar',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foopkg.foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
Checking a package
|
||||
==================
|
||||
|
||||
The ``check`` command allows you to verify if your package meta-data
|
||||
meet the minimum requirements to build a distribution.
|
||||
|
||||
To run it, just call it using your :file:`setup.py` script. If something is
|
||||
missing, ``check`` will display a warning.
|
||||
|
||||
Let's take an example with a simple script::
|
||||
|
||||
from distutils.core import setup
|
||||
|
||||
setup(name='foobar')
|
||||
|
||||
Running the ``check`` command will display some warnings:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python setup.py check
|
||||
running check
|
||||
warning: check: missing required meta-data: version, url
|
||||
warning: check: missing meta-data: either (author and author_email) or
|
||||
(maintainer and maintainer_email) must be supplied
|
||||
|
||||
|
||||
If you use the reStructuredText syntax in the ``long_description`` field and
|
||||
`docutils`_ is installed you can check if the syntax is fine with the
|
||||
``check`` command, using the ``restructuredtext`` option.
|
||||
|
||||
For example, if the :file:`setup.py` script is changed like this::
|
||||
|
||||
from distutils.core import setup
|
||||
|
||||
desc = """\
|
||||
My description
|
||||
==============
|
||||
|
||||
This is the description of the ``foobar`` package.
|
||||
"""
|
||||
|
||||
setup(name='foobar', version='1', author='tarek',
|
||||
author_email='tarek@ziade.org',
|
||||
url='http://example.com', long_description=desc)
|
||||
|
||||
Where the long description is broken, ``check`` will be able to detect it
|
||||
by using the :mod:`docutils` parser:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python setup.py check --restructuredtext
|
||||
running check
|
||||
warning: check: Title underline too short. (line 2)
|
||||
warning: check: Could not finish the parsing.
|
||||
|
||||
Reading the metadata
|
||||
=====================
|
||||
|
||||
The :func:`distutils.core.setup` function provides a command-line interface
|
||||
that allows you to query the metadata fields of a project through the
|
||||
``setup.py`` script of a given project:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python setup.py --name
|
||||
distribute
|
||||
|
||||
This call reads the ``name`` metadata by running the
|
||||
:func:`distutils.core.setup` function. Although, when a source or binary
|
||||
distribution is created with Distutils, the metadata fields are written
|
||||
in a static file called :file:`PKG-INFO`. When a Distutils-based project is
|
||||
installed in Python, the :file:`PKG-INFO` file is copied alongside the modules
|
||||
and packages of the distribution under :file:`NAME-VERSION-pyX.X.egg-info`,
|
||||
where ``NAME`` is the name of the project, ``VERSION`` its version as defined
|
||||
in the Metadata, and ``pyX.X`` the major and minor version of Python like
|
||||
``2.7`` or ``3.2``.
|
||||
|
||||
You can read back this static file, by using the
|
||||
:class:`distutils.dist.DistributionMetadata` class and its
|
||||
:func:`read_pkg_file` method::
|
||||
|
||||
>>> from distutils.dist import DistributionMetadata
|
||||
>>> metadata = DistributionMetadata()
|
||||
>>> metadata.read_pkg_file(open('distribute-0.6.8-py2.7.egg-info'))
|
||||
>>> metadata.name
|
||||
'distribute'
|
||||
>>> metadata.version
|
||||
'0.6.8'
|
||||
>>> metadata.description
|
||||
'Easily download, build, install, upgrade, and uninstall Python packages'
|
||||
|
||||
Notice that the class can also be instantiated with a metadata file path to
|
||||
loads its values::
|
||||
|
||||
>>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info'
|
||||
>>> DistributionMetadata(pkg_info_path).name
|
||||
'distribute'
|
||||
|
||||
|
||||
.. % \section{Multiple extension modules}
|
||||
.. % \label{multiple-ext}
|
||||
|
||||
.. % \section{Putting it all together}
|
||||
|
||||
|
||||
.. _docutils: http://docutils.sourceforge.net
|
||||
96
python-3.7.4-docs-html/_sources/distutils/extending.rst.txt
Normal file
96
python-3.7.4-docs-html/_sources/distutils/extending.rst.txt
Normal file
@@ -0,0 +1,96 @@
|
||||
.. _extending-distutils:
|
||||
|
||||
*******************
|
||||
Extending Distutils
|
||||
*******************
|
||||
|
||||
Distutils can be extended in various ways. Most extensions take the form of new
|
||||
commands or replacements for existing commands. New commands may be written to
|
||||
support new types of platform-specific packaging, for example, while
|
||||
replacements for existing commands may be made to modify details of how the
|
||||
command operates on a package.
|
||||
|
||||
Most extensions of the distutils are made within :file:`setup.py` scripts that
|
||||
want to modify existing commands; many simply add a few file extensions that
|
||||
should be copied into packages in addition to :file:`.py` files as a
|
||||
convenience.
|
||||
|
||||
Most distutils command implementations are subclasses of the
|
||||
:class:`distutils.cmd.Command` class. New commands may directly inherit from
|
||||
:class:`Command`, while replacements often derive from :class:`Command`
|
||||
indirectly, directly subclassing the command they are replacing. Commands are
|
||||
required to derive from :class:`Command`.
|
||||
|
||||
.. % \section{Extending existing commands}
|
||||
.. % \label{extend-existing}
|
||||
|
||||
.. % \section{Writing new commands}
|
||||
.. % \label{new-commands}
|
||||
.. % \XXX{Would an uninstall command be a good example here?}
|
||||
|
||||
|
||||
Integrating new commands
|
||||
========================
|
||||
|
||||
There are different ways to integrate new command implementations into
|
||||
distutils. The most difficult is to lobby for the inclusion of the new features
|
||||
in distutils itself, and wait for (and require) a version of Python that
|
||||
provides that support. This is really hard for many reasons.
|
||||
|
||||
The most common, and possibly the most reasonable for most needs, is to include
|
||||
the new implementations with your :file:`setup.py` script, and cause the
|
||||
:func:`distutils.core.setup` function use them::
|
||||
|
||||
from distutils.command.build_py import build_py as _build_py
|
||||
from distutils.core import setup
|
||||
|
||||
class build_py(_build_py):
|
||||
"""Specialized Python source builder."""
|
||||
|
||||
# implement whatever needs to be different...
|
||||
|
||||
setup(cmdclass={'build_py': build_py},
|
||||
...)
|
||||
|
||||
This approach is most valuable if the new implementations must be used to use a
|
||||
particular package, as everyone interested in the package will need to have the
|
||||
new command implementation.
|
||||
|
||||
Beginning with Python 2.4, a third option is available, intended to allow new
|
||||
commands to be added which can support existing :file:`setup.py` scripts without
|
||||
requiring modifications to the Python installation. This is expected to allow
|
||||
third-party extensions to provide support for additional packaging systems, but
|
||||
the commands can be used for anything distutils commands can be used for. A new
|
||||
configuration option, ``command_packages`` (command-line option
|
||||
:option:`!--command-packages`), can be used to specify additional packages to be
|
||||
searched for modules implementing commands. Like all distutils options, this
|
||||
can be specified on the command line or in a configuration file. This option
|
||||
can only be set in the ``[global]`` section of a configuration file, or before
|
||||
any commands on the command line. If set in a configuration file, it can be
|
||||
overridden from the command line; setting it to an empty string on the command
|
||||
line causes the default to be used. This should never be set in a configuration
|
||||
file provided with a package.
|
||||
|
||||
This new option can be used to add any number of packages to the list of
|
||||
packages searched for command implementations; multiple package names should be
|
||||
separated by commas. When not specified, the search is only performed in the
|
||||
:mod:`distutils.command` package. When :file:`setup.py` is run with the option
|
||||
``--command-packages distcmds,buildcmds``, however, the packages
|
||||
:mod:`distutils.command`, :mod:`distcmds`, and :mod:`buildcmds` will be searched
|
||||
in that order. New commands are expected to be implemented in modules of the
|
||||
same name as the command by classes sharing the same name. Given the example
|
||||
command line option above, the command :command:`bdist_openpkg` could be
|
||||
implemented by the class :class:`distcmds.bdist_openpkg.bdist_openpkg` or
|
||||
:class:`buildcmds.bdist_openpkg.bdist_openpkg`.
|
||||
|
||||
|
||||
Adding new distribution types
|
||||
=============================
|
||||
|
||||
Commands that create distributions (files in the :file:`dist/` directory) need
|
||||
to add ``(command, filename)`` pairs to ``self.distribution.dist_files`` so that
|
||||
:command:`upload` can upload it to PyPI. The *filename* in the pair contains no
|
||||
path information, only the name of the file itself. In dry-run mode, pairs
|
||||
should still be added to represent what would have been created.
|
||||
|
||||
|
||||
40
python-3.7.4-docs-html/_sources/distutils/index.rst.txt
Normal file
40
python-3.7.4-docs-html/_sources/distutils/index.rst.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
.. _distutils-index:
|
||||
|
||||
##############################################
|
||||
Distributing Python Modules (Legacy version)
|
||||
##############################################
|
||||
|
||||
:Authors: Greg Ward, Anthony Baxter
|
||||
:Email: distutils-sig@python.org
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`distributing-index`
|
||||
The up to date module distribution documentations
|
||||
|
||||
This document describes the Python Distribution Utilities ("Distutils") from
|
||||
the module developer's point of view, describing how to use the Distutils to
|
||||
make Python modules and extensions easily available to a wider audience with
|
||||
very little overhead for build/release/install mechanics.
|
||||
|
||||
.. note::
|
||||
|
||||
This guide only covers the basic tools for building and distributing
|
||||
extensions that are provided as part of this version of Python. Third party
|
||||
tools offer easier to use and more secure alternatives. Refer to the `quick
|
||||
recommendations section <https://packaging.python.org/guides/tool-recommendations/>`__
|
||||
in the Python Packaging User Guide for more information.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:numbered:
|
||||
|
||||
introduction.rst
|
||||
setupscript.rst
|
||||
configfile.rst
|
||||
sourcedist.rst
|
||||
builtdist.rst
|
||||
examples.rst
|
||||
extending.rst
|
||||
commandref.rst
|
||||
apiref.rst
|
||||
212
python-3.7.4-docs-html/_sources/distutils/introduction.rst.txt
Normal file
212
python-3.7.4-docs-html/_sources/distutils/introduction.rst.txt
Normal file
@@ -0,0 +1,212 @@
|
||||
.. _distutils-intro:
|
||||
|
||||
****************************
|
||||
An Introduction to Distutils
|
||||
****************************
|
||||
|
||||
This document covers using the Distutils to distribute your Python modules,
|
||||
concentrating on the role of developer/distributor: if you're looking for
|
||||
information on installing Python modules, you should refer to the
|
||||
:ref:`install-index` chapter.
|
||||
|
||||
|
||||
.. _distutils-concepts:
|
||||
|
||||
Concepts & Terminology
|
||||
======================
|
||||
|
||||
Using the Distutils is quite simple, both for module developers and for
|
||||
users/administrators installing third-party modules. As a developer, your
|
||||
responsibilities (apart from writing solid, well-documented and well-tested
|
||||
code, of course!) are:
|
||||
|
||||
* write a setup script (:file:`setup.py` by convention)
|
||||
|
||||
* (optional) write a setup configuration file
|
||||
|
||||
* create a source distribution
|
||||
|
||||
* (optional) create one or more built (binary) distributions
|
||||
|
||||
Each of these tasks is covered in this document.
|
||||
|
||||
Not all module developers have access to a multitude of platforms, so it's not
|
||||
always feasible to expect them to create a multitude of built distributions. It
|
||||
is hoped that a class of intermediaries, called *packagers*, will arise to
|
||||
address this need. Packagers will take source distributions released by module
|
||||
developers, build them on one or more platforms, and release the resulting built
|
||||
distributions. Thus, users on the most popular platforms will be able to
|
||||
install most popular Python module distributions in the most natural way for
|
||||
their platform, without having to run a single setup script or compile a line of
|
||||
code.
|
||||
|
||||
|
||||
.. _distutils-simple-example:
|
||||
|
||||
A Simple Example
|
||||
================
|
||||
|
||||
The setup script is usually quite simple, although since it's written in Python,
|
||||
there are no arbitrary limits to what you can do with it, though you should be
|
||||
careful about putting arbitrarily expensive operations in your setup script.
|
||||
Unlike, say, Autoconf-style configure scripts, the setup script may be run
|
||||
multiple times in the course of building and installing your module
|
||||
distribution.
|
||||
|
||||
If all you want to do is distribute a module called :mod:`foo`, contained in a
|
||||
file :file:`foo.py`, then your setup script can be as simple as this::
|
||||
|
||||
from distutils.core import setup
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Some observations:
|
||||
|
||||
* most information that you supply to the Distutils is supplied as keyword
|
||||
arguments to the :func:`setup` function
|
||||
|
||||
* those keyword arguments fall into two categories: package metadata (name,
|
||||
version number) and information about what's in the package (a list of pure
|
||||
Python modules, in this case)
|
||||
|
||||
* modules are specified by module name, not filename (the same will hold true
|
||||
for packages and extensions)
|
||||
|
||||
* it's recommended that you supply a little more metadata, in particular your
|
||||
name, email address and a URL for the project (see section :ref:`setup-script`
|
||||
for an example)
|
||||
|
||||
To create a source distribution for this module, you would create a setup
|
||||
script, :file:`setup.py`, containing the above code, and run this command from a
|
||||
terminal::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
For Windows, open a command prompt window (:menuselection:`Start -->
|
||||
Accessories`) and change the command to::
|
||||
|
||||
setup.py sdist
|
||||
|
||||
:command:`sdist` will create an archive file (e.g., tarball on Unix, ZIP file on Windows)
|
||||
containing your setup script :file:`setup.py`, and your module :file:`foo.py`.
|
||||
The archive file will be named :file:`foo-1.0.tar.gz` (or :file:`.zip`), and
|
||||
will unpack into a directory :file:`foo-1.0`.
|
||||
|
||||
If an end-user wishes to install your :mod:`foo` module, all they have to do is
|
||||
download :file:`foo-1.0.tar.gz` (or :file:`.zip`), unpack it, and---from the
|
||||
:file:`foo-1.0` directory---run ::
|
||||
|
||||
python setup.py install
|
||||
|
||||
which will ultimately copy :file:`foo.py` to the appropriate directory for
|
||||
third-party modules in their Python installation.
|
||||
|
||||
This simple example demonstrates some fundamental concepts of the Distutils.
|
||||
First, both developers and installers have the same basic user interface, i.e.
|
||||
the setup script. The difference is which Distutils *commands* they use: the
|
||||
:command:`sdist` command is almost exclusively for module developers, while
|
||||
:command:`install` is more often for installers (although most developers will
|
||||
want to install their own code occasionally).
|
||||
|
||||
If you want to make things really easy for your users, you can create one or
|
||||
more built distributions for them. For instance, if you are running on a
|
||||
Windows machine, and want to make things easy for other Windows users, you can
|
||||
create an executable installer (the most appropriate type of built distribution
|
||||
for this platform) with the :command:`bdist_wininst` command. For example::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
|
||||
will create an executable installer, :file:`foo-1.0.win32.exe`, in the current
|
||||
directory.
|
||||
|
||||
Other useful built distribution formats are RPM, implemented by the
|
||||
:command:`bdist_rpm` command, Solaris :program:`pkgtool`
|
||||
(:command:`bdist_pkgtool`), and HP-UX :program:`swinstall`
|
||||
(:command:`bdist_sdux`). For example, the following command will create an RPM
|
||||
file called :file:`foo-1.0.noarch.rpm`::
|
||||
|
||||
python setup.py bdist_rpm
|
||||
|
||||
(The :command:`bdist_rpm` command uses the :command:`rpm` executable, therefore
|
||||
this has to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or
|
||||
Mandrake Linux.)
|
||||
|
||||
You can find out what distribution formats are available at any time by running
|
||||
::
|
||||
|
||||
python setup.py bdist --help-formats
|
||||
|
||||
|
||||
.. _python-terms:
|
||||
|
||||
General Python terminology
|
||||
==========================
|
||||
|
||||
If you're reading this document, you probably have a good idea of what modules,
|
||||
extensions, and so forth are. Nevertheless, just to be sure that everyone is
|
||||
operating from a common starting point, we offer the following glossary of
|
||||
common Python terms:
|
||||
|
||||
module
|
||||
the basic unit of code reusability in Python: a block of code imported by some
|
||||
other code. Three types of modules concern us here: pure Python modules,
|
||||
extension modules, and packages.
|
||||
|
||||
pure Python module
|
||||
a module written in Python and contained in a single :file:`.py` file (and
|
||||
possibly associated :file:`.pyc` files). Sometimes referred to as a
|
||||
"pure module."
|
||||
|
||||
extension module
|
||||
a module written in the low-level language of the Python implementation: C/C++
|
||||
for Python, Java for Jython. Typically contained in a single dynamically
|
||||
loadable pre-compiled file, e.g. a shared object (:file:`.so`) file for Python
|
||||
extensions on Unix, a DLL (given the :file:`.pyd` extension) for Python
|
||||
extensions on Windows, or a Java class file for Jython extensions. (Note that
|
||||
currently, the Distutils only handles C/C++ extensions for Python.)
|
||||
|
||||
package
|
||||
a module that contains other modules; typically contained in a directory in the
|
||||
filesystem and distinguished from other directories by the presence of a file
|
||||
:file:`__init__.py`.
|
||||
|
||||
root package
|
||||
the root of the hierarchy of packages. (This isn't really a package, since it
|
||||
doesn't have an :file:`__init__.py` file. But we have to call it something.)
|
||||
The vast majority of the standard library is in the root package, as are many
|
||||
small, standalone third-party modules that don't belong to a larger module
|
||||
collection. Unlike regular packages, modules in the root package can be found in
|
||||
many directories: in fact, every directory listed in ``sys.path`` contributes
|
||||
modules to the root package.
|
||||
|
||||
|
||||
.. _distutils-term:
|
||||
|
||||
Distutils-specific terminology
|
||||
==============================
|
||||
|
||||
The following terms apply more specifically to the domain of distributing Python
|
||||
modules using the Distutils:
|
||||
|
||||
module distribution
|
||||
a collection of Python modules distributed together as a single downloadable
|
||||
resource and meant to be installed *en masse*. Examples of some well-known
|
||||
module distributions are NumPy, SciPy, Pillow,
|
||||
or mxBase. (This would be called a *package*, except that term is
|
||||
already taken in the Python context: a single module distribution may contain
|
||||
zero, one, or many Python packages.)
|
||||
|
||||
pure module distribution
|
||||
a module distribution that contains only pure Python modules and packages.
|
||||
Sometimes referred to as a "pure distribution."
|
||||
|
||||
non-pure module distribution
|
||||
a module distribution that contains at least one extension module. Sometimes
|
||||
referred to as a "non-pure distribution."
|
||||
|
||||
distribution root
|
||||
the top-level directory of your source tree (or source distribution); the
|
||||
directory where :file:`setup.py` exists. Generally :file:`setup.py` will be
|
||||
run from this directory.
|
||||
@@ -0,0 +1,16 @@
|
||||
:orphan:
|
||||
|
||||
.. _package-index:
|
||||
|
||||
*******************************
|
||||
The Python Package Index (PyPI)
|
||||
*******************************
|
||||
|
||||
The `Python Package Index (PyPI)`_ stores metadata describing distributions
|
||||
packaged with distutils and other publishing tools, as well the distribution
|
||||
archives themselves.
|
||||
|
||||
References to up to date PyPI documentation can be found at
|
||||
:ref:`publishing-python-packages`.
|
||||
|
||||
.. _Python Package Index (PyPI): https://pypi.org
|
||||
711
python-3.7.4-docs-html/_sources/distutils/setupscript.rst.txt
Normal file
711
python-3.7.4-docs-html/_sources/distutils/setupscript.rst.txt
Normal file
@@ -0,0 +1,711 @@
|
||||
.. _setup-script:
|
||||
|
||||
************************
|
||||
Writing the Setup Script
|
||||
************************
|
||||
|
||||
The setup script is the centre of all activity in building, distributing, and
|
||||
installing modules using the Distutils. The main purpose of the setup script is
|
||||
to describe your module distribution to the Distutils, so that the various
|
||||
commands that operate on your modules do the right thing. As we saw in section
|
||||
:ref:`distutils-simple-example` above, the setup script consists mainly of a call to
|
||||
:func:`setup`, and most information supplied to the Distutils by the module
|
||||
developer is supplied as keyword arguments to :func:`setup`.
|
||||
|
||||
Here's a slightly more involved example, which we'll follow for the next couple
|
||||
of sections: the Distutils' own setup script. (Keep in mind that although the
|
||||
Distutils are included with Python 1.6 and later, they also have an independent
|
||||
existence so that Python 1.5.2 users can use them to install other module
|
||||
distributions. The Distutils' own setup script, shown here, is used to install
|
||||
the package into Python 1.5.2.) ::
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
from distutils.core import setup
|
||||
|
||||
setup(name='Distutils',
|
||||
version='1.0',
|
||||
description='Python Distribution Utilities',
|
||||
author='Greg Ward',
|
||||
author_email='gward@python.net',
|
||||
url='https://www.python.org/sigs/distutils-sig/',
|
||||
packages=['distutils', 'distutils.command'],
|
||||
)
|
||||
|
||||
There are only two differences between this and the trivial one-file
|
||||
distribution presented in section :ref:`distutils-simple-example`: more metadata, and the
|
||||
specification of pure Python modules by package, rather than by module. This is
|
||||
important since the Distutils consist of a couple of dozen modules split into
|
||||
(so far) two packages; an explicit list of every module would be tedious to
|
||||
generate and difficult to maintain. For more information on the additional
|
||||
meta-data, see section :ref:`meta-data`.
|
||||
|
||||
Note that any pathnames (files or directories) supplied in the setup script
|
||||
should be written using the Unix convention, i.e. slash-separated. The
|
||||
Distutils will take care of converting this platform-neutral representation into
|
||||
whatever is appropriate on your current platform before actually using the
|
||||
pathname. This makes your setup script portable across operating systems, which
|
||||
of course is one of the major goals of the Distutils. In this spirit, all
|
||||
pathnames in this document are slash-separated.
|
||||
|
||||
This, of course, only applies to pathnames given to Distutils functions. If
|
||||
you, for example, use standard Python functions such as :func:`glob.glob` or
|
||||
:func:`os.listdir` to specify files, you should be careful to write portable
|
||||
code instead of hardcoding path separators::
|
||||
|
||||
glob.glob(os.path.join('mydir', 'subdir', '*.html'))
|
||||
os.listdir(os.path.join('mydir', 'subdir'))
|
||||
|
||||
|
||||
.. _listing-packages:
|
||||
|
||||
Listing whole packages
|
||||
======================
|
||||
|
||||
The ``packages`` option tells the Distutils to process (build, distribute,
|
||||
install, etc.) all pure Python modules found in each package mentioned in the
|
||||
``packages`` list. In order to do this, of course, there has to be a
|
||||
correspondence between package names and directories in the filesystem. The
|
||||
default correspondence is the most obvious one, i.e. package :mod:`distutils` is
|
||||
found in the directory :file:`distutils` relative to the distribution root.
|
||||
Thus, when you say ``packages = ['foo']`` in your setup script, you are
|
||||
promising that the Distutils will find a file :file:`foo/__init__.py` (which
|
||||
might be spelled differently on your system, but you get the idea) relative to
|
||||
the directory where your setup script lives. If you break this promise, the
|
||||
Distutils will issue a warning but still process the broken package anyway.
|
||||
|
||||
If you use a different convention to lay out your source directory, that's no
|
||||
problem: you just have to supply the ``package_dir`` option to tell the
|
||||
Distutils about your convention. For example, say you keep all Python source
|
||||
under :file:`lib`, so that modules in the "root package" (i.e., not in any
|
||||
package at all) are in :file:`lib`, modules in the :mod:`foo` package are in
|
||||
:file:`lib/foo`, and so forth. Then you would put ::
|
||||
|
||||
package_dir = {'': 'lib'}
|
||||
|
||||
in your setup script. The keys to this dictionary are package names, and an
|
||||
empty package name stands for the root package. The values are directory names
|
||||
relative to your distribution root. In this case, when you say ``packages =
|
||||
['foo']``, you are promising that the file :file:`lib/foo/__init__.py` exists.
|
||||
|
||||
Another possible convention is to put the :mod:`foo` package right in
|
||||
:file:`lib`, the :mod:`foo.bar` package in :file:`lib/bar`, etc. This would be
|
||||
written in the setup script as ::
|
||||
|
||||
package_dir = {'foo': 'lib'}
|
||||
|
||||
A ``package: dir`` entry in the ``package_dir`` dictionary implicitly
|
||||
applies to all packages below *package*, so the :mod:`foo.bar` case is
|
||||
automatically handled here. In this example, having ``packages = ['foo',
|
||||
'foo.bar']`` tells the Distutils to look for :file:`lib/__init__.py` and
|
||||
:file:`lib/bar/__init__.py`. (Keep in mind that although ``package_dir``
|
||||
applies recursively, you must explicitly list all packages in
|
||||
``packages``: the Distutils will *not* recursively scan your source tree
|
||||
looking for any directory with an :file:`__init__.py` file.)
|
||||
|
||||
|
||||
.. _listing-modules:
|
||||
|
||||
Listing individual modules
|
||||
==========================
|
||||
|
||||
For a small module distribution, you might prefer to list all modules rather
|
||||
than listing packages---especially the case of a single module that goes in the
|
||||
"root package" (i.e., no package at all). This simplest case was shown in
|
||||
section :ref:`distutils-simple-example`; here is a slightly more involved example::
|
||||
|
||||
py_modules = ['mod1', 'pkg.mod2']
|
||||
|
||||
This describes two modules, one of them in the "root" package, the other in the
|
||||
:mod:`pkg` package. Again, the default package/directory layout implies that
|
||||
these two modules can be found in :file:`mod1.py` and :file:`pkg/mod2.py`, and
|
||||
that :file:`pkg/__init__.py` exists as well. And again, you can override the
|
||||
package/directory correspondence using the ``package_dir`` option.
|
||||
|
||||
|
||||
.. _describing-extensions:
|
||||
|
||||
Describing extension modules
|
||||
============================
|
||||
|
||||
Just as writing Python extension modules is a bit more complicated than writing
|
||||
pure Python modules, describing them to the Distutils is a bit more complicated.
|
||||
Unlike pure modules, it's not enough just to list modules or packages and expect
|
||||
the Distutils to go out and find the right files; you have to specify the
|
||||
extension name, source file(s), and any compile/link requirements (include
|
||||
directories, libraries to link with, etc.).
|
||||
|
||||
.. XXX read over this section
|
||||
|
||||
All of this is done through another keyword argument to :func:`setup`, the
|
||||
``ext_modules`` option. ``ext_modules`` is just a list of
|
||||
:class:`~distutils.core.Extension` instances, each of which describes a
|
||||
single extension module.
|
||||
Suppose your distribution includes a single extension, called :mod:`foo` and
|
||||
implemented by :file:`foo.c`. If no additional instructions to the
|
||||
compiler/linker are needed, describing this extension is quite simple::
|
||||
|
||||
Extension('foo', ['foo.c'])
|
||||
|
||||
The :class:`Extension` class can be imported from :mod:`distutils.core` along
|
||||
with :func:`setup`. Thus, the setup script for a module distribution that
|
||||
contains only this one extension and nothing else might be::
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
setup(name='foo',
|
||||
version='1.0',
|
||||
ext_modules=[Extension('foo', ['foo.c'])],
|
||||
)
|
||||
|
||||
The :class:`Extension` class (actually, the underlying extension-building
|
||||
machinery implemented by the :command:`build_ext` command) supports a great deal
|
||||
of flexibility in describing Python extensions, which is explained in the
|
||||
following sections.
|
||||
|
||||
|
||||
Extension names and packages
|
||||
----------------------------
|
||||
|
||||
The first argument to the :class:`~distutils.core.Extension` constructor is
|
||||
always the name of the extension, including any package names. For example, ::
|
||||
|
||||
Extension('foo', ['src/foo1.c', 'src/foo2.c'])
|
||||
|
||||
describes an extension that lives in the root package, while ::
|
||||
|
||||
Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])
|
||||
|
||||
describes the same extension in the :mod:`pkg` package. The source files and
|
||||
resulting object code are identical in both cases; the only difference is where
|
||||
in the filesystem (and therefore where in Python's namespace hierarchy) the
|
||||
resulting extension lives.
|
||||
|
||||
If you have a number of extensions all in the same package (or all under the
|
||||
same base package), use the ``ext_package`` keyword argument to
|
||||
:func:`setup`. For example, ::
|
||||
|
||||
setup(...,
|
||||
ext_package='pkg',
|
||||
ext_modules=[Extension('foo', ['foo.c']),
|
||||
Extension('subpkg.bar', ['bar.c'])],
|
||||
)
|
||||
|
||||
will compile :file:`foo.c` to the extension :mod:`pkg.foo`, and :file:`bar.c` to
|
||||
:mod:`pkg.subpkg.bar`.
|
||||
|
||||
|
||||
Extension source files
|
||||
----------------------
|
||||
|
||||
The second argument to the :class:`~distutils.core.Extension` constructor is
|
||||
a list of source
|
||||
files. Since the Distutils currently only support C, C++, and Objective-C
|
||||
extensions, these are normally C/C++/Objective-C source files. (Be sure to use
|
||||
appropriate extensions to distinguish C++ source files: :file:`.cc` and
|
||||
:file:`.cpp` seem to be recognized by both Unix and Windows compilers.)
|
||||
|
||||
However, you can also include SWIG interface (:file:`.i`) files in the list; the
|
||||
:command:`build_ext` command knows how to deal with SWIG extensions: it will run
|
||||
SWIG on the interface file and compile the resulting C/C++ file into your
|
||||
extension.
|
||||
|
||||
.. XXX SWIG support is rough around the edges and largely untested!
|
||||
|
||||
This warning notwithstanding, options to SWIG can be currently passed like
|
||||
this::
|
||||
|
||||
setup(...,
|
||||
ext_modules=[Extension('_foo', ['foo.i'],
|
||||
swig_opts=['-modern', '-I../include'])],
|
||||
py_modules=['foo'],
|
||||
)
|
||||
|
||||
Or on the commandline like this::
|
||||
|
||||
> python setup.py build_ext --swig-opts="-modern -I../include"
|
||||
|
||||
On some platforms, you can include non-source files that are processed by the
|
||||
compiler and included in your extension. Currently, this just means Windows
|
||||
message text (:file:`.mc`) files and resource definition (:file:`.rc`) files for
|
||||
Visual C++. These will be compiled to binary resource (:file:`.res`) files and
|
||||
linked into the executable.
|
||||
|
||||
|
||||
Preprocessor options
|
||||
--------------------
|
||||
|
||||
Three optional arguments to :class:`~distutils.core.Extension` will help if
|
||||
you need to specify include directories to search or preprocessor macros to
|
||||
define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``.
|
||||
|
||||
For example, if your extension requires header files in the :file:`include`
|
||||
directory under your distribution root, use the ``include_dirs`` option::
|
||||
|
||||
Extension('foo', ['foo.c'], include_dirs=['include'])
|
||||
|
||||
You can specify absolute directories there; if you know that your extension will
|
||||
only be built on Unix systems with X11R6 installed to :file:`/usr`, you can get
|
||||
away with ::
|
||||
|
||||
Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])
|
||||
|
||||
You should avoid this sort of non-portable usage if you plan to distribute your
|
||||
code: it's probably better to write C code like ::
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
If you need to include header files from some other Python extension, you can
|
||||
take advantage of the fact that header files are installed in a consistent way
|
||||
by the Distutils :command:`install_headers` command. For example, the Numerical
|
||||
Python header files are installed (on a standard Unix installation) to
|
||||
:file:`/usr/local/include/python1.5/Numerical`. (The exact location will differ
|
||||
according to your platform and Python installation.) Since the Python include
|
||||
directory---\ :file:`/usr/local/include/python1.5` in this case---is always
|
||||
included in the search path when building Python extensions, the best approach
|
||||
is to write C code like ::
|
||||
|
||||
#include <Numerical/arrayobject.h>
|
||||
|
||||
If you must put the :file:`Numerical` include directory right into your header
|
||||
search path, though, you can find that directory using the Distutils
|
||||
:mod:`distutils.sysconfig` module::
|
||||
|
||||
from distutils.sysconfig import get_python_inc
|
||||
incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical')
|
||||
setup(...,
|
||||
Extension(..., include_dirs=[incdir]),
|
||||
)
|
||||
|
||||
Even though this is quite portable---it will work on any Python installation,
|
||||
regardless of platform---it's probably easier to just write your C code in the
|
||||
sensible way.
|
||||
|
||||
You can define and undefine pre-processor macros with the ``define_macros`` and
|
||||
``undef_macros`` options. ``define_macros`` takes a list of ``(name, value)``
|
||||
tuples, where ``name`` is the name of the macro to define (a string) and
|
||||
``value`` is its value: either a string or ``None``. (Defining a macro ``FOO``
|
||||
to ``None`` is the equivalent of a bare ``#define FOO`` in your C source: with
|
||||
most compilers, this sets ``FOO`` to the string ``1``.) ``undef_macros`` is
|
||||
just a list of macros to undefine.
|
||||
|
||||
For example::
|
||||
|
||||
Extension(...,
|
||||
define_macros=[('NDEBUG', '1'),
|
||||
('HAVE_STRFTIME', None)],
|
||||
undef_macros=['HAVE_FOO', 'HAVE_BAR'])
|
||||
|
||||
is the equivalent of having this at the top of every C source file::
|
||||
|
||||
#define NDEBUG 1
|
||||
#define HAVE_STRFTIME
|
||||
#undef HAVE_FOO
|
||||
#undef HAVE_BAR
|
||||
|
||||
|
||||
Library options
|
||||
---------------
|
||||
|
||||
You can also specify the libraries to link against when building your extension,
|
||||
and the directories to search for those libraries. The ``libraries`` option is
|
||||
a list of libraries to link against, ``library_dirs`` is a list of directories
|
||||
to search for libraries at link-time, and ``runtime_library_dirs`` is a list of
|
||||
directories to search for shared (dynamically loaded) libraries at run-time.
|
||||
|
||||
For example, if you need to link against libraries known to be in the standard
|
||||
library search path on target systems ::
|
||||
|
||||
Extension(...,
|
||||
libraries=['gdbm', 'readline'])
|
||||
|
||||
If you need to link with libraries in a non-standard location, you'll have to
|
||||
include the location in ``library_dirs``::
|
||||
|
||||
Extension(...,
|
||||
library_dirs=['/usr/X11R6/lib'],
|
||||
libraries=['X11', 'Xt'])
|
||||
|
||||
(Again, this sort of non-portable construct should be avoided if you intend to
|
||||
distribute your code.)
|
||||
|
||||
.. XXX Should mention clib libraries here or somewhere else!
|
||||
|
||||
|
||||
Other options
|
||||
-------------
|
||||
|
||||
There are still some other options which can be used to handle special cases.
|
||||
|
||||
The ``optional`` option is a boolean; if it is true,
|
||||
a build failure in the extension will not abort the build process, but
|
||||
instead simply not install the failing extension.
|
||||
|
||||
The ``extra_objects`` option is a list of object files to be passed to the
|
||||
linker. These files must not have extensions, as the default extension for the
|
||||
compiler is used.
|
||||
|
||||
``extra_compile_args`` and ``extra_link_args`` can be used to
|
||||
specify additional command line options for the respective compiler and linker
|
||||
command lines.
|
||||
|
||||
``export_symbols`` is only useful on Windows. It can contain a list of
|
||||
symbols (functions or variables) to be exported. This option is not needed when
|
||||
building compiled extensions: Distutils will automatically add ``initmodule``
|
||||
to the list of exported symbols.
|
||||
|
||||
The ``depends`` option is a list of files that the extension depends on
|
||||
(for example header files). The build command will call the compiler on the
|
||||
sources to rebuild extension if any on this files has been modified since the
|
||||
previous build.
|
||||
|
||||
Relationships between Distributions and Packages
|
||||
================================================
|
||||
|
||||
A distribution may relate to packages in three specific ways:
|
||||
|
||||
#. It can require packages or modules.
|
||||
|
||||
#. It can provide packages or modules.
|
||||
|
||||
#. It can obsolete packages or modules.
|
||||
|
||||
These relationships can be specified using keyword arguments to the
|
||||
:func:`distutils.core.setup` function.
|
||||
|
||||
Dependencies on other Python modules and packages can be specified by supplying
|
||||
the *requires* keyword argument to :func:`setup`. The value must be a list of
|
||||
strings. Each string specifies a package that is required, and optionally what
|
||||
versions are sufficient.
|
||||
|
||||
To specify that any version of a module or package is required, the string
|
||||
should consist entirely of the module or package name. Examples include
|
||||
``'mymodule'`` and ``'xml.parsers.expat'``.
|
||||
|
||||
If specific versions are required, a sequence of qualifiers can be supplied in
|
||||
parentheses. Each qualifier may consist of a comparison operator and a version
|
||||
number. The accepted comparison operators are::
|
||||
|
||||
< > ==
|
||||
<= >= !=
|
||||
|
||||
These can be combined by using multiple qualifiers separated by commas (and
|
||||
optional whitespace). In this case, all of the qualifiers must be matched; a
|
||||
logical AND is used to combine the evaluations.
|
||||
|
||||
Let's look at a bunch of examples:
|
||||
|
||||
+-------------------------+----------------------------------------------+
|
||||
| Requires Expression | Explanation |
|
||||
+=========================+==============================================+
|
||||
| ``==1.0`` | Only version ``1.0`` is compatible |
|
||||
+-------------------------+----------------------------------------------+
|
||||
| ``>1.0, !=1.5.1, <2.0`` | Any version after ``1.0`` and before ``2.0`` |
|
||||
| | is compatible, except ``1.5.1`` |
|
||||
+-------------------------+----------------------------------------------+
|
||||
|
||||
Now that we can specify dependencies, we also need to be able to specify what we
|
||||
provide that other distributions can require. This is done using the *provides*
|
||||
keyword argument to :func:`setup`. The value for this keyword is a list of
|
||||
strings, each of which names a Python module or package, and optionally
|
||||
identifies the version. If the version is not specified, it is assumed to match
|
||||
that of the distribution.
|
||||
|
||||
Some examples:
|
||||
|
||||
+---------------------+----------------------------------------------+
|
||||
| Provides Expression | Explanation |
|
||||
+=====================+==============================================+
|
||||
| ``mypkg`` | Provide ``mypkg``, using the distribution |
|
||||
| | version |
|
||||
+---------------------+----------------------------------------------+
|
||||
| ``mypkg (1.1)`` | Provide ``mypkg`` version 1.1, regardless of |
|
||||
| | the distribution version |
|
||||
+---------------------+----------------------------------------------+
|
||||
|
||||
A package can declare that it obsoletes other packages using the *obsoletes*
|
||||
keyword argument. The value for this is similar to that of the *requires*
|
||||
keyword: a list of strings giving module or package specifiers. Each specifier
|
||||
consists of a module or package name optionally followed by one or more version
|
||||
qualifiers. Version qualifiers are given in parentheses after the module or
|
||||
package name.
|
||||
|
||||
The versions identified by the qualifiers are those that are obsoleted by the
|
||||
distribution being described. If no qualifiers are given, all versions of the
|
||||
named module or package are understood to be obsoleted.
|
||||
|
||||
.. _distutils-installing-scripts:
|
||||
|
||||
Installing Scripts
|
||||
==================
|
||||
|
||||
So far we have been dealing with pure and non-pure Python modules, which are
|
||||
usually not run by themselves but imported by scripts.
|
||||
|
||||
Scripts are files containing Python source code, intended to be started from the
|
||||
command line. Scripts don't require Distutils to do anything very complicated.
|
||||
The only clever feature is that if the first line of the script starts with
|
||||
``#!`` and contains the word "python", the Distutils will adjust the first line
|
||||
to refer to the current interpreter location. By default, it is replaced with
|
||||
the current interpreter location. The :option:`!--executable` (or :option:`!-e`)
|
||||
option will allow the interpreter path to be explicitly overridden.
|
||||
|
||||
The ``scripts`` option simply is a list of files to be handled in this
|
||||
way. From the PyXML setup script::
|
||||
|
||||
setup(...,
|
||||
scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
|
||||
)
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
All the scripts will also be added to the ``MANIFEST`` file if no template is
|
||||
provided. See :ref:`manifest`.
|
||||
|
||||
|
||||
.. _distutils-installing-package-data:
|
||||
|
||||
Installing Package Data
|
||||
=======================
|
||||
|
||||
Often, additional files need to be installed into a package. These files are
|
||||
often data that's closely related to the package's implementation, or text files
|
||||
containing documentation that might be of interest to programmers using the
|
||||
package. These files are called :dfn:`package data`.
|
||||
|
||||
Package data can be added to packages using the ``package_data`` keyword
|
||||
argument to the :func:`setup` function. The value must be a mapping from
|
||||
package name to a list of relative path names that should be copied into the
|
||||
package. The paths are interpreted as relative to the directory containing the
|
||||
package (information from the ``package_dir`` mapping is used if appropriate);
|
||||
that is, the files are expected to be part of the package in the source
|
||||
directories. They may contain glob patterns as well.
|
||||
|
||||
The path names may contain directory portions; any necessary directories will be
|
||||
created in the installation.
|
||||
|
||||
For example, if a package should contain a subdirectory with several data files,
|
||||
the files can be arranged like this in the source tree::
|
||||
|
||||
setup.py
|
||||
src/
|
||||
mypkg/
|
||||
__init__.py
|
||||
module.py
|
||||
data/
|
||||
tables.dat
|
||||
spoons.dat
|
||||
forks.dat
|
||||
|
||||
The corresponding call to :func:`setup` might be::
|
||||
|
||||
setup(...,
|
||||
packages=['mypkg'],
|
||||
package_dir={'mypkg': 'src/mypkg'},
|
||||
package_data={'mypkg': ['data/*.dat']},
|
||||
)
|
||||
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
All the files that match ``package_data`` will be added to the ``MANIFEST``
|
||||
file if no template is provided. See :ref:`manifest`.
|
||||
|
||||
|
||||
.. _distutils-additional-files:
|
||||
|
||||
Installing Additional Files
|
||||
===========================
|
||||
|
||||
The ``data_files`` option can be used to specify additional files needed
|
||||
by the module distribution: configuration files, message catalogs, data files,
|
||||
anything which doesn't fit in the previous categories.
|
||||
|
||||
``data_files`` specifies a sequence of (*directory*, *files*) pairs in the
|
||||
following way::
|
||||
|
||||
setup(...,
|
||||
data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
|
||||
('config', ['cfg/data.cfg'])],
|
||||
)
|
||||
|
||||
Each (*directory*, *files*) pair in the sequence specifies the installation
|
||||
directory and the files to install there.
|
||||
|
||||
Each file name in *files* is interpreted relative to the :file:`setup.py`
|
||||
script at the top of the package source distribution. Note that you can
|
||||
specify the directory where the data files will be installed, but you cannot
|
||||
rename the data files themselves.
|
||||
|
||||
The *directory* should be a relative path. It is interpreted relative to the
|
||||
installation prefix (Python's ``sys.prefix`` for system installations;
|
||||
``site.USER_BASE`` for user installations). Distutils allows *directory* to be
|
||||
an absolute installation path, but this is discouraged since it is
|
||||
incompatible with the wheel packaging format. No directory information from
|
||||
*files* is used to determine the final location of the installed file; only
|
||||
the name of the file is used.
|
||||
|
||||
You can specify the ``data_files`` options as a simple sequence of files
|
||||
without specifying a target directory, but this is not recommended, and the
|
||||
:command:`install` command will print a warning in this case. To install data
|
||||
files directly in the target directory, an empty string should be given as the
|
||||
directory.
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
All the files that match ``data_files`` will be added to the ``MANIFEST``
|
||||
file if no template is provided. See :ref:`manifest`.
|
||||
|
||||
|
||||
.. _meta-data:
|
||||
|
||||
Additional meta-data
|
||||
====================
|
||||
|
||||
The setup script may include additional meta-data beyond the name and version.
|
||||
This information includes:
|
||||
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| Meta-Data | Description | Value | Notes |
|
||||
+======================+===========================+=================+========+
|
||||
| ``name`` | name of the package | short string | \(1) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``version`` | version of this release | short string | (1)(2) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``author`` | package author's name | short string | \(3) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``author_email`` | email address of the | email address | \(3) |
|
||||
| | package author | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``maintainer`` | package maintainer's name | short string | \(3) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``maintainer_email`` | email address of the | email address | \(3) |
|
||||
| | package maintainer | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``url`` | home page for the package | URL | \(1) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``description`` | short, summary | short string | |
|
||||
| | description of the | | |
|
||||
| | package | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``long_description`` | longer description of the | long string | \(4) |
|
||||
| | package | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``download_url`` | location where the | URL | |
|
||||
| | package may be downloaded | | |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``classifiers`` | a list of classifiers | list of strings | (6)(7) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``platforms`` | a list of platforms | list of strings | (6)(8) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``keywords`` | a list of keywords | list of strings | (6)(8) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
| ``license`` | license for the package | short string | \(5) |
|
||||
+----------------------+---------------------------+-----------------+--------+
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
These fields are required.
|
||||
|
||||
(2)
|
||||
It is recommended that versions take the form *major.minor[.patch[.sub]]*.
|
||||
|
||||
(3)
|
||||
Either the author or the maintainer must be identified. If maintainer is
|
||||
provided, distutils lists it as the author in :file:`PKG-INFO`.
|
||||
|
||||
(4)
|
||||
The ``long_description`` field is used by PyPI when you publish a package,
|
||||
to build its project page.
|
||||
|
||||
(5)
|
||||
The ``license`` field is a text indicating the license covering the
|
||||
package where the license is not a selection from the "License" Trove
|
||||
classifiers. See the ``Classifier`` field. Notice that
|
||||
there's a ``licence`` distribution option which is deprecated but still
|
||||
acts as an alias for ``license``.
|
||||
|
||||
(6)
|
||||
This field must be a list.
|
||||
|
||||
(7)
|
||||
The valid classifiers are listed on
|
||||
`PyPI <https://pypi.org/classifiers>`_.
|
||||
|
||||
(8)
|
||||
To preserve backward compatibility, this field also accepts a string. If
|
||||
you pass a comma-separated string ``'foo, bar'``, it will be converted to
|
||||
``['foo', 'bar']``, Otherwise, it will be converted to a list of one
|
||||
string.
|
||||
|
||||
'short string'
|
||||
A single line of text, not more than 200 characters.
|
||||
|
||||
'long string'
|
||||
Multiple lines of plain text in reStructuredText format (see
|
||||
http://docutils.sourceforge.net/).
|
||||
|
||||
'list of strings'
|
||||
See below.
|
||||
|
||||
Encoding the version information is an art in itself. Python packages generally
|
||||
adhere to the version format *major.minor[.patch][sub]*. The major number is 0
|
||||
for initial, experimental releases of software. It is incremented for releases
|
||||
that represent major milestones in a package. The minor number is incremented
|
||||
when important new features are added to the package. The patch number
|
||||
increments when bug-fix releases are made. Additional trailing version
|
||||
information is sometimes used to indicate sub-releases. These are
|
||||
"a1,a2,...,aN" (for alpha releases, where functionality and API may change),
|
||||
"b1,b2,...,bN" (for beta releases, which only fix bugs) and "pr1,pr2,...,prN"
|
||||
(for final pre-release release testing). Some examples:
|
||||
|
||||
0.1.0
|
||||
the first, experimental release of a package
|
||||
|
||||
1.0.1a2
|
||||
the second alpha release of the first patch version of 1.0
|
||||
|
||||
``classifiers`` must be specified in a list::
|
||||
|
||||
setup(...,
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'Environment :: Console',
|
||||
'Environment :: Web Environment',
|
||||
'Intended Audience :: End Users/Desktop',
|
||||
'Intended Audience :: Developers',
|
||||
'Intended Audience :: System Administrators',
|
||||
'License :: OSI Approved :: Python Software Foundation License',
|
||||
'Operating System :: MacOS :: MacOS X',
|
||||
'Operating System :: Microsoft :: Windows',
|
||||
'Operating System :: POSIX',
|
||||
'Programming Language :: Python',
|
||||
'Topic :: Communications :: Email',
|
||||
'Topic :: Office/Business',
|
||||
'Topic :: Software Development :: Bug Tracking',
|
||||
],
|
||||
)
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
:class:`~distutils.core.setup` now warns when ``classifiers``, ``keywords``
|
||||
or ``platforms`` fields are not specified as a list or a string.
|
||||
|
||||
.. _debug-setup-script:
|
||||
|
||||
Debugging the setup script
|
||||
==========================
|
||||
|
||||
Sometimes things go wrong, and the setup script doesn't do what the developer
|
||||
wants.
|
||||
|
||||
Distutils catches any exceptions when running the setup script, and print a
|
||||
simple error message before the script is terminated. The motivation for this
|
||||
behaviour is to not confuse administrators who don't know much about Python and
|
||||
are trying to install a package. If they get a big long traceback from deep
|
||||
inside the guts of Distutils, they may think the package or the Python
|
||||
installation is broken because they don't read all the way down to the bottom
|
||||
and see that it's a permission problem.
|
||||
|
||||
On the other hand, this doesn't help the developer to find the cause of the
|
||||
failure. For this purpose, the :envvar:`DISTUTILS_DEBUG` environment variable can be set
|
||||
to anything except an empty string, and distutils will now print detailed
|
||||
information about what it is doing, dump the full traceback when an exception
|
||||
occurs, and print the whole command line when an external program (like a C
|
||||
compiler) fails.
|
||||
240
python-3.7.4-docs-html/_sources/distutils/sourcedist.rst.txt
Normal file
240
python-3.7.4-docs-html/_sources/distutils/sourcedist.rst.txt
Normal file
@@ -0,0 +1,240 @@
|
||||
.. _source-dist:
|
||||
|
||||
******************************
|
||||
Creating a Source Distribution
|
||||
******************************
|
||||
|
||||
As shown in section :ref:`distutils-simple-example`, you use the :command:`sdist` command
|
||||
to create a source distribution. In the simplest case, ::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
(assuming you haven't specified any :command:`sdist` options in the setup script
|
||||
or config file), :command:`sdist` creates the archive of the default format for
|
||||
the current platform. The default format is a gzip'ed tar file
|
||||
(:file:`.tar.gz`) on Unix, and ZIP file on Windows.
|
||||
|
||||
You can specify as many formats as you like using the :option:`!--formats`
|
||||
option, for example::
|
||||
|
||||
python setup.py sdist --formats=gztar,zip
|
||||
|
||||
to create a gzipped tarball and a zip file. The available formats are:
|
||||
|
||||
+-----------+-------------------------+---------+
|
||||
| Format | Description | Notes |
|
||||
+===========+=========================+=========+
|
||||
| ``zip`` | zip file (:file:`.zip`) | (1),(3) |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``gztar`` | gzip'ed tar file | \(2) |
|
||||
| | (:file:`.tar.gz`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``bztar`` | bzip2'ed tar file | |
|
||||
| | (:file:`.tar.bz2`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``xztar`` | xz'ed tar file | |
|
||||
| | (:file:`.tar.xz`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``ztar`` | compressed tar file | \(4) |
|
||||
| | (:file:`.tar.Z`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
| ``tar`` | tar file (:file:`.tar`) | |
|
||||
+-----------+-------------------------+---------+
|
||||
|
||||
.. versionchanged:: 3.5
|
||||
Added support for the ``xztar`` format.
|
||||
|
||||
Notes:
|
||||
|
||||
(1)
|
||||
default on Windows
|
||||
|
||||
(2)
|
||||
default on Unix
|
||||
|
||||
(3)
|
||||
requires either external :program:`zip` utility or :mod:`zipfile` module (part
|
||||
of the standard Python library since Python 1.6)
|
||||
|
||||
(4)
|
||||
requires the :program:`compress` program. Notice that this format is now
|
||||
pending for deprecation and will be removed in the future versions of Python.
|
||||
|
||||
When using any ``tar`` format (``gztar``, ``bztar``, ``xztar``, ``ztar`` or
|
||||
``tar``), under Unix you can specify the ``owner`` and ``group`` names
|
||||
that will be set for each member of the archive.
|
||||
|
||||
For example, if you want all files of the archive to be owned by root::
|
||||
|
||||
python setup.py sdist --owner=root --group=root
|
||||
|
||||
|
||||
.. _manifest:
|
||||
|
||||
Specifying the files to distribute
|
||||
==================================
|
||||
|
||||
If you don't supply an explicit list of files (or instructions on how to
|
||||
generate one), the :command:`sdist` command puts a minimal default set into the
|
||||
source distribution:
|
||||
|
||||
* all Python source files implied by the ``py_modules`` and
|
||||
``packages`` options
|
||||
|
||||
* all C source files mentioned in the ``ext_modules`` or
|
||||
``libraries`` options
|
||||
|
||||
.. XXX getting C library sources currently broken---no
|
||||
:meth:`get_source_files` method in :file:`build_clib.py`!
|
||||
|
||||
* scripts identified by the ``scripts`` option
|
||||
See :ref:`distutils-installing-scripts`.
|
||||
|
||||
* anything that looks like a test script: :file:`test/test\*.py` (currently, the
|
||||
Distutils don't do anything with test scripts except include them in source
|
||||
distributions, but in the future there will be a standard for testing Python
|
||||
module distributions)
|
||||
|
||||
* Any of the standard README files (:file:`README`, :file:`README.txt`,
|
||||
or :file:`README.rst`), :file:`setup.py` (or whatever you called your setup
|
||||
script), and :file:`setup.cfg`.
|
||||
|
||||
* all files that matches the ``package_data`` metadata.
|
||||
See :ref:`distutils-installing-package-data`.
|
||||
|
||||
* all files that matches the ``data_files`` metadata.
|
||||
See :ref:`distutils-additional-files`.
|
||||
|
||||
Sometimes this is enough, but usually you will want to specify additional files
|
||||
to distribute. The typical way to do this is to write a *manifest template*,
|
||||
called :file:`MANIFEST.in` by default. The manifest template is just a list of
|
||||
instructions for how to generate your manifest file, :file:`MANIFEST`, which is
|
||||
the exact list of files to include in your source distribution. The
|
||||
:command:`sdist` command processes this template and generates a manifest based
|
||||
on its instructions and what it finds in the filesystem.
|
||||
|
||||
If you prefer to roll your own manifest file, the format is simple: one filename
|
||||
per line, regular files (or symlinks to them) only. If you do supply your own
|
||||
:file:`MANIFEST`, you must specify everything: the default set of files
|
||||
described above does not apply in this case.
|
||||
|
||||
.. versionchanged:: 3.1
|
||||
An existing generated :file:`MANIFEST` will be regenerated without
|
||||
:command:`sdist` comparing its modification time to the one of
|
||||
:file:`MANIFEST.in` or :file:`setup.py`.
|
||||
|
||||
.. versionchanged:: 3.1.3
|
||||
:file:`MANIFEST` files start with a comment indicating they are generated.
|
||||
Files without this comment are not overwritten or removed.
|
||||
|
||||
.. versionchanged:: 3.2.2
|
||||
:command:`sdist` will read a :file:`MANIFEST` file if no :file:`MANIFEST.in`
|
||||
exists, like it used to do.
|
||||
|
||||
.. versionchanged:: 3.7
|
||||
:file:`README.rst` is now included in the list of distutils standard READMEs.
|
||||
|
||||
|
||||
The manifest template has one command per line, where each command specifies a
|
||||
set of files to include or exclude from the source distribution. For an
|
||||
example, again we turn to the Distutils' own manifest template:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
include *.txt
|
||||
recursive-include examples *.txt *.py
|
||||
prune examples/sample?/build
|
||||
|
||||
The meanings should be fairly clear: include all files in the distribution root
|
||||
matching :file:`\*.txt`, all files anywhere under the :file:`examples` directory
|
||||
matching :file:`\*.txt` or :file:`\*.py`, and exclude all directories matching
|
||||
:file:`examples/sample?/build`. All of this is done *after* the standard
|
||||
include set, so you can exclude files from the standard set with explicit
|
||||
instructions in the manifest template. (Or, you can use the
|
||||
:option:`!--no-defaults` option to disable the standard set entirely.) There are
|
||||
several other commands available in the manifest template mini-language; see
|
||||
section :ref:`sdist-cmd`.
|
||||
|
||||
The order of commands in the manifest template matters: initially, we have the
|
||||
list of default files as described above, and each command in the template adds
|
||||
to or removes from that list of files. Once we have fully processed the
|
||||
manifest template, we remove files that should not be included in the source
|
||||
distribution:
|
||||
|
||||
* all files in the Distutils "build" tree (default :file:`build/`)
|
||||
|
||||
* all files in directories named :file:`RCS`, :file:`CVS`, :file:`.svn`,
|
||||
:file:`.hg`, :file:`.git`, :file:`.bzr` or :file:`_darcs`
|
||||
|
||||
Now we have our complete list of files, which is written to the manifest for
|
||||
future reference, and then used to build the source distribution archive(s).
|
||||
|
||||
You can disable the default set of included files with the
|
||||
:option:`!--no-defaults` option, and you can disable the standard exclude set
|
||||
with :option:`!--no-prune`.
|
||||
|
||||
Following the Distutils' own manifest template, let's trace how the
|
||||
:command:`sdist` command builds the list of files to include in the Distutils
|
||||
source distribution:
|
||||
|
||||
#. include all Python source files in the :file:`distutils` and
|
||||
:file:`distutils/command` subdirectories (because packages corresponding to
|
||||
those two directories were mentioned in the ``packages`` option in the
|
||||
setup script---see section :ref:`setup-script`)
|
||||
|
||||
#. include :file:`README.txt`, :file:`setup.py`, and :file:`setup.cfg` (standard
|
||||
files)
|
||||
|
||||
#. include :file:`test/test\*.py` (standard files)
|
||||
|
||||
#. include :file:`\*.txt` in the distribution root (this will find
|
||||
:file:`README.txt` a second time, but such redundancies are weeded out later)
|
||||
|
||||
#. include anything matching :file:`\*.txt` or :file:`\*.py` in the sub-tree
|
||||
under :file:`examples`,
|
||||
|
||||
#. exclude all files in the sub-trees starting at directories matching
|
||||
:file:`examples/sample?/build`\ ---this may exclude files included by the
|
||||
previous two steps, so it's important that the ``prune`` command in the manifest
|
||||
template comes after the ``recursive-include`` command
|
||||
|
||||
#. exclude the entire :file:`build` tree, and any :file:`RCS`, :file:`CVS`,
|
||||
:file:`.svn`, :file:`.hg`, :file:`.git`, :file:`.bzr` and :file:`_darcs`
|
||||
directories
|
||||
|
||||
Just like in the setup script, file and directory names in the manifest template
|
||||
should always be slash-separated; the Distutils will take care of converting
|
||||
them to the standard representation on your platform. That way, the manifest
|
||||
template is portable across operating systems.
|
||||
|
||||
|
||||
.. _manifest-options:
|
||||
|
||||
Manifest-related options
|
||||
========================
|
||||
|
||||
The normal course of operations for the :command:`sdist` command is as follows:
|
||||
|
||||
* if the manifest file (:file:`MANIFEST` by default) exists and the first line
|
||||
does not have a comment indicating it is generated from :file:`MANIFEST.in`,
|
||||
then it is used as is, unaltered
|
||||
|
||||
* if the manifest file doesn't exist or has been previously automatically
|
||||
generated, read :file:`MANIFEST.in` and create the manifest
|
||||
|
||||
* if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest
|
||||
with just the default file set
|
||||
|
||||
* use the list of files now in :file:`MANIFEST` (either just generated or read
|
||||
in) to create the source distribution archive(s)
|
||||
|
||||
There are a couple of options that modify this behaviour. First, use the
|
||||
:option:`!--no-defaults` and :option:`!--no-prune` to disable the standard
|
||||
"include" and "exclude" sets.
|
||||
|
||||
Second, you might just want to (re)generate the manifest, but not create a source
|
||||
distribution::
|
||||
|
||||
python setup.py sdist --manifest-only
|
||||
|
||||
:option:`!-o` is a shortcut for :option:`!--manifest-only`.
|
||||
@@ -0,0 +1,8 @@
|
||||
:orphan:
|
||||
|
||||
***************************************
|
||||
Uploading Packages to the Package Index
|
||||
***************************************
|
||||
|
||||
References to up to date PyPI documentation can be found at
|
||||
:ref:`publishing-python-packages`.
|
||||
167
python-3.7.4-docs-html/_sources/extending/building.rst.txt
Normal file
167
python-3.7.4-docs-html/_sources/extending/building.rst.txt
Normal file
@@ -0,0 +1,167 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _building:
|
||||
|
||||
*****************************
|
||||
Building C and C++ Extensions
|
||||
*****************************
|
||||
|
||||
A C extension for CPython is a shared library (e.g. a ``.so`` file on Linux,
|
||||
``.pyd`` on Windows), which exports an *initialization function*.
|
||||
|
||||
To be importable, the shared library must be available on :envvar:`PYTHONPATH`,
|
||||
and must be named after the module name, with an appropriate extension.
|
||||
When using distutils, the correct filename is generated automatically.
|
||||
|
||||
The initialization function has the signature:
|
||||
|
||||
.. c:function:: PyObject* PyInit_modulename(void)
|
||||
|
||||
It returns either a fully-initialized module, or a :c:type:`PyModuleDef`
|
||||
instance. See :ref:`initializing-modules` for details.
|
||||
|
||||
.. highlightlang:: python
|
||||
|
||||
For modules with ASCII-only names, the function must be named
|
||||
``PyInit_<modulename>``, with ``<modulename>`` replaced by the name of the
|
||||
module. When using :ref:`multi-phase-initialization`, non-ASCII module names
|
||||
are allowed. In this case, the initialization function name is
|
||||
``PyInitU_<modulename>``, with ``<modulename>`` encoded using Python's
|
||||
*punycode* encoding with hyphens replaced by underscores. In Python::
|
||||
|
||||
def initfunc_name(name):
|
||||
try:
|
||||
suffix = b'_' + name.encode('ascii')
|
||||
except UnicodeEncodeError:
|
||||
suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
|
||||
return b'PyInit' + suffix
|
||||
|
||||
It is possible to export multiple modules from a single shared library by
|
||||
defining multiple initialization functions. However, importing them requires
|
||||
using symbolic links or a custom importer, because by default only the
|
||||
function corresponding to the filename is found.
|
||||
See the *"Multiple modules in one library"* section in :pep:`489` for details.
|
||||
|
||||
|
||||
.. highlightlang:: c
|
||||
|
||||
Building C and C++ Extensions with distutils
|
||||
============================================
|
||||
|
||||
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
|
||||
|
||||
Extension modules can be built using distutils, which is included in Python.
|
||||
Since distutils also supports creation of binary packages, users don't
|
||||
necessarily need a compiler and distutils to install the extension.
|
||||
|
||||
A distutils package contains a driver script, :file:`setup.py`. This is a plain
|
||||
Python file, which, in the most simple case, could look like this:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
module1 = Extension('demo',
|
||||
sources = ['demo.c'])
|
||||
|
||||
setup (name = 'PackageName',
|
||||
version = '1.0',
|
||||
description = 'This is a demo package',
|
||||
ext_modules = [module1])
|
||||
|
||||
|
||||
With this :file:`setup.py`, and a file :file:`demo.c`, running ::
|
||||
|
||||
python setup.py build
|
||||
|
||||
will compile :file:`demo.c`, and produce an extension module named ``demo`` in
|
||||
the :file:`build` directory. Depending on the system, the module file will end
|
||||
up in a subdirectory :file:`build/lib.system`, and may have a name like
|
||||
:file:`demo.so` or :file:`demo.pyd`.
|
||||
|
||||
In the :file:`setup.py`, all execution is performed by calling the ``setup``
|
||||
function. This takes a variable number of keyword arguments, of which the
|
||||
example above uses only a subset. Specifically, the example specifies
|
||||
meta-information to build packages, and it specifies the contents of the
|
||||
package. Normally, a package will contain additional modules, like Python
|
||||
source modules, documentation, subpackages, etc. Please refer to the distutils
|
||||
documentation in :ref:`distutils-index` to learn more about the features of
|
||||
distutils; this section explains building extension modules only.
|
||||
|
||||
It is common to pre-compute arguments to :func:`setup`, to better structure the
|
||||
driver script. In the example above, the ``ext_modules`` argument to
|
||||
:func:`~distutils.core.setup` is a list of extension modules, each of which is
|
||||
an instance of
|
||||
the :class:`~distutils.extension.Extension`. In the example, the instance
|
||||
defines an extension named ``demo`` which is build by compiling a single source
|
||||
file, :file:`demo.c`.
|
||||
|
||||
In many cases, building an extension is more complex, since additional
|
||||
preprocessor defines and libraries may be needed. This is demonstrated in the
|
||||
example below.
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
|
||||
module1 = Extension('demo',
|
||||
define_macros = [('MAJOR_VERSION', '1'),
|
||||
('MINOR_VERSION', '0')],
|
||||
include_dirs = ['/usr/local/include'],
|
||||
libraries = ['tcl83'],
|
||||
library_dirs = ['/usr/local/lib'],
|
||||
sources = ['demo.c'])
|
||||
|
||||
setup (name = 'PackageName',
|
||||
version = '1.0',
|
||||
description = 'This is a demo package',
|
||||
author = 'Martin v. Loewis',
|
||||
author_email = 'martin@v.loewis.de',
|
||||
url = 'https://docs.python.org/extending/building',
|
||||
long_description = '''
|
||||
This is really just a demo package.
|
||||
''',
|
||||
ext_modules = [module1])
|
||||
|
||||
|
||||
In this example, :func:`~distutils.core.setup` is called with additional
|
||||
meta-information, which
|
||||
is recommended when distribution packages have to be built. For the extension
|
||||
itself, it specifies preprocessor defines, include directories, library
|
||||
directories, and libraries. Depending on the compiler, distutils passes this
|
||||
information in different ways to the compiler. For example, on Unix, this may
|
||||
result in the compilation commands ::
|
||||
|
||||
gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o
|
||||
|
||||
gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so
|
||||
|
||||
These lines are for demonstration purposes only; distutils users should trust
|
||||
that distutils gets the invocations right.
|
||||
|
||||
|
||||
.. _distributing:
|
||||
|
||||
Distributing your extension modules
|
||||
===================================
|
||||
|
||||
When an extension has been successfully build, there are three ways to use it.
|
||||
|
||||
End-users will typically want to install the module, they do so by running ::
|
||||
|
||||
python setup.py install
|
||||
|
||||
Module maintainers should produce source packages; to do so, they run ::
|
||||
|
||||
python setup.py sdist
|
||||
|
||||
In some cases, additional files need to be included in a source distribution;
|
||||
this is done through a :file:`MANIFEST.in` file; see :ref:`manifest` for details.
|
||||
|
||||
If the source distribution has been build successfully, maintainers can also
|
||||
create binary distributions. Depending on the platform, one of the following
|
||||
commands can be used to do so. ::
|
||||
|
||||
python setup.py bdist_wininst
|
||||
python setup.py bdist_rpm
|
||||
python setup.py bdist_dumb
|
||||
336
python-3.7.4-docs-html/_sources/extending/embedding.rst.txt
Normal file
336
python-3.7.4-docs-html/_sources/extending/embedding.rst.txt
Normal file
@@ -0,0 +1,336 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _embedding:
|
||||
|
||||
***************************************
|
||||
Embedding Python in Another Application
|
||||
***************************************
|
||||
|
||||
The previous chapters discussed how to extend Python, that is, how to extend the
|
||||
functionality of Python by attaching a library of C functions to it. It is also
|
||||
possible to do it the other way around: enrich your C/C++ application by
|
||||
embedding Python in it. Embedding provides your application with the ability to
|
||||
implement some of the functionality of your application in Python rather than C
|
||||
or C++. This can be used for many purposes; one example would be to allow users
|
||||
to tailor the application to their needs by writing some scripts in Python. You
|
||||
can also use it yourself if some of the functionality can be written in Python
|
||||
more easily.
|
||||
|
||||
Embedding Python is similar to extending it, but not quite. The difference is
|
||||
that when you extend Python, the main program of the application is still the
|
||||
Python interpreter, while if you embed Python, the main program may have nothing
|
||||
to do with Python --- instead, some parts of the application occasionally call
|
||||
the Python interpreter to run some Python code.
|
||||
|
||||
So if you are embedding Python, you are providing your own main program. One of
|
||||
the things this main program has to do is initialize the Python interpreter. At
|
||||
the very least, you have to call the function :c:func:`Py_Initialize`. There are
|
||||
optional calls to pass command line arguments to Python. Then later you can
|
||||
call the interpreter from any part of the application.
|
||||
|
||||
There are several different ways to call the interpreter: you can pass a string
|
||||
containing Python statements to :c:func:`PyRun_SimpleString`, or you can pass a
|
||||
stdio file pointer and a file name (for identification in error messages only)
|
||||
to :c:func:`PyRun_SimpleFile`. You can also call the lower-level operations
|
||||
described in the previous chapters to construct and use Python objects.
|
||||
|
||||
|
||||
.. seealso::
|
||||
|
||||
:ref:`c-api-index`
|
||||
The details of Python's C interface are given in this manual. A great deal of
|
||||
necessary information can be found here.
|
||||
|
||||
|
||||
.. _high-level-embedding:
|
||||
|
||||
Very High Level Embedding
|
||||
=========================
|
||||
|
||||
The simplest form of embedding Python is the use of the very high level
|
||||
interface. This interface is intended to execute a Python script without needing
|
||||
to interact with the application directly. This can for example be used to
|
||||
perform some operation on a file. ::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
|
||||
if (program == NULL) {
|
||||
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
|
||||
exit(1);
|
||||
}
|
||||
Py_SetProgramName(program); /* optional but recommended */
|
||||
Py_Initialize();
|
||||
PyRun_SimpleString("from time import time,ctime\n"
|
||||
"print('Today is', ctime(time()))\n");
|
||||
if (Py_FinalizeEx() < 0) {
|
||||
exit(120);
|
||||
}
|
||||
PyMem_RawFree(program);
|
||||
return 0;
|
||||
}
|
||||
|
||||
The :c:func:`Py_SetProgramName` function should be called before
|
||||
:c:func:`Py_Initialize` to inform the interpreter about paths to Python run-time
|
||||
libraries. Next, the Python interpreter is initialized with
|
||||
:c:func:`Py_Initialize`, followed by the execution of a hard-coded Python script
|
||||
that prints the date and time. Afterwards, the :c:func:`Py_FinalizeEx` call shuts
|
||||
the interpreter down, followed by the end of the program. In a real program,
|
||||
you may want to get the Python script from another source, perhaps a text-editor
|
||||
routine, a file, or a database. Getting the Python code from a file can better
|
||||
be done by using the :c:func:`PyRun_SimpleFile` function, which saves you the
|
||||
trouble of allocating memory space and loading the file contents.
|
||||
|
||||
|
||||
.. _lower-level-embedding:
|
||||
|
||||
Beyond Very High Level Embedding: An overview
|
||||
=============================================
|
||||
|
||||
The high level interface gives you the ability to execute arbitrary pieces of
|
||||
Python code from your application, but exchanging data values is quite
|
||||
cumbersome to say the least. If you want that, you should use lower level calls.
|
||||
At the cost of having to write more C code, you can achieve almost anything.
|
||||
|
||||
It should be noted that extending Python and embedding Python is quite the same
|
||||
activity, despite the different intent. Most topics discussed in the previous
|
||||
chapters are still valid. To show this, consider what the extension code from
|
||||
Python to C really does:
|
||||
|
||||
#. Convert data values from Python to C,
|
||||
|
||||
#. Perform a function call to a C routine using the converted values, and
|
||||
|
||||
#. Convert the data values from the call from C to Python.
|
||||
|
||||
When embedding Python, the interface code does:
|
||||
|
||||
#. Convert data values from C to Python,
|
||||
|
||||
#. Perform a function call to a Python interface routine using the converted
|
||||
values, and
|
||||
|
||||
#. Convert the data values from the call from Python to C.
|
||||
|
||||
As you can see, the data conversion steps are simply swapped to accommodate the
|
||||
different direction of the cross-language transfer. The only difference is the
|
||||
routine that you call between both data conversions. When extending, you call a
|
||||
C routine, when embedding, you call a Python routine.
|
||||
|
||||
This chapter will not discuss how to convert data from Python to C and vice
|
||||
versa. Also, proper use of references and dealing with errors is assumed to be
|
||||
understood. Since these aspects do not differ from extending the interpreter,
|
||||
you can refer to earlier chapters for the required information.
|
||||
|
||||
|
||||
.. _pure-embedding:
|
||||
|
||||
Pure Embedding
|
||||
==============
|
||||
|
||||
The first program aims to execute a function in a Python script. Like in the
|
||||
section about the very high level interface, the Python interpreter does not
|
||||
directly interact with the application (but that will change in the next
|
||||
section).
|
||||
|
||||
The code to run a function defined in a Python script is:
|
||||
|
||||
.. literalinclude:: ../includes/run-func.c
|
||||
|
||||
|
||||
This code loads a Python script using ``argv[1]``, and calls the function named
|
||||
in ``argv[2]``. Its integer arguments are the other values of the ``argv``
|
||||
array. If you :ref:`compile and link <compiling>` this program (let's call
|
||||
the finished executable :program:`call`), and use it to execute a Python
|
||||
script, such as:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def multiply(a,b):
|
||||
print("Will compute", a, "times", b)
|
||||
c = 0
|
||||
for i in range(0, a):
|
||||
c = c + b
|
||||
return c
|
||||
|
||||
then the result should be:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ call multiply multiply 3 2
|
||||
Will compute 3 times 2
|
||||
Result of call: 6
|
||||
|
||||
Although the program is quite large for its functionality, most of the code is
|
||||
for data conversion between Python and C, and for error reporting. The
|
||||
interesting part with respect to embedding Python starts with ::
|
||||
|
||||
Py_Initialize();
|
||||
pName = PyUnicode_DecodeFSDefault(argv[1]);
|
||||
/* Error checking of pName left out */
|
||||
pModule = PyImport_Import(pName);
|
||||
|
||||
After initializing the interpreter, the script is loaded using
|
||||
:c:func:`PyImport_Import`. This routine needs a Python string as its argument,
|
||||
which is constructed using the :c:func:`PyUnicode_FromString` data conversion
|
||||
routine. ::
|
||||
|
||||
pFunc = PyObject_GetAttrString(pModule, argv[2]);
|
||||
/* pFunc is a new reference */
|
||||
|
||||
if (pFunc && PyCallable_Check(pFunc)) {
|
||||
...
|
||||
}
|
||||
Py_XDECREF(pFunc);
|
||||
|
||||
Once the script is loaded, the name we're looking for is retrieved using
|
||||
:c:func:`PyObject_GetAttrString`. If the name exists, and the object returned is
|
||||
callable, you can safely assume that it is a function. The program then
|
||||
proceeds by constructing a tuple of arguments as normal. The call to the Python
|
||||
function is then made with::
|
||||
|
||||
pValue = PyObject_CallObject(pFunc, pArgs);
|
||||
|
||||
Upon return of the function, ``pValue`` is either *NULL* or it contains a
|
||||
reference to the return value of the function. Be sure to release the reference
|
||||
after examining the value.
|
||||
|
||||
|
||||
.. _extending-with-embedding:
|
||||
|
||||
Extending Embedded Python
|
||||
=========================
|
||||
|
||||
Until now, the embedded Python interpreter had no access to functionality from
|
||||
the application itself. The Python API allows this by extending the embedded
|
||||
interpreter. That is, the embedded interpreter gets extended with routines
|
||||
provided by the application. While it sounds complex, it is not so bad. Simply
|
||||
forget for a while that the application starts the Python interpreter. Instead,
|
||||
consider the application to be a set of subroutines, and write some glue code
|
||||
that gives Python access to those routines, just like you would write a normal
|
||||
Python extension. For example::
|
||||
|
||||
static int numargs=0;
|
||||
|
||||
/* Return the number of arguments of the application command line */
|
||||
static PyObject*
|
||||
emb_numargs(PyObject *self, PyObject *args)
|
||||
{
|
||||
if(!PyArg_ParseTuple(args, ":numargs"))
|
||||
return NULL;
|
||||
return PyLong_FromLong(numargs);
|
||||
}
|
||||
|
||||
static PyMethodDef EmbMethods[] = {
|
||||
{"numargs", emb_numargs, METH_VARARGS,
|
||||
"Return the number of arguments received by the process."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
static PyModuleDef EmbModule = {
|
||||
PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,
|
||||
NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
static PyObject*
|
||||
PyInit_emb(void)
|
||||
{
|
||||
return PyModule_Create(&EmbModule);
|
||||
}
|
||||
|
||||
Insert the above code just above the :c:func:`main` function. Also, insert the
|
||||
following two statements before the call to :c:func:`Py_Initialize`::
|
||||
|
||||
numargs = argc;
|
||||
PyImport_AppendInittab("emb", &PyInit_emb);
|
||||
|
||||
These two lines initialize the ``numargs`` variable, and make the
|
||||
:func:`emb.numargs` function accessible to the embedded Python interpreter.
|
||||
With these extensions, the Python script can do things like
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import emb
|
||||
print("Number of arguments", emb.numargs())
|
||||
|
||||
In a real application, the methods will expose an API of the application to
|
||||
Python.
|
||||
|
||||
.. TODO: threads, code examples do not really behave well if errors happen
|
||||
(what to watch out for)
|
||||
|
||||
|
||||
.. _embeddingincplusplus:
|
||||
|
||||
Embedding Python in C++
|
||||
=======================
|
||||
|
||||
It is also possible to embed Python in a C++ program; precisely how this is done
|
||||
will depend on the details of the C++ system used; in general you will need to
|
||||
write the main program in C++, and use the C++ compiler to compile and link your
|
||||
program. There is no need to recompile Python itself using C++.
|
||||
|
||||
|
||||
.. _compiling:
|
||||
|
||||
Compiling and Linking under Unix-like systems
|
||||
=============================================
|
||||
|
||||
It is not necessarily trivial to find the right flags to pass to your
|
||||
compiler (and linker) in order to embed the Python interpreter into your
|
||||
application, particularly because Python needs to load library modules
|
||||
implemented as C dynamic extensions (:file:`.so` files) linked against
|
||||
it.
|
||||
|
||||
To find out the required compiler and linker flags, you can execute the
|
||||
:file:`python{X.Y}-config` script which is generated as part of the
|
||||
installation process (a :file:`python3-config` script may also be
|
||||
available). This script has several options, of which the following will
|
||||
be directly useful to you:
|
||||
|
||||
* ``pythonX.Y-config --cflags`` will give you the recommended flags when
|
||||
compiling:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ /opt/bin/python3.4-config --cflags
|
||||
-I/opt/include/python3.4m -I/opt/include/python3.4m -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
|
||||
|
||||
* ``pythonX.Y-config --ldflags`` will give you the recommended flags when
|
||||
linking:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ /opt/bin/python3.4-config --ldflags
|
||||
-L/opt/lib/python3.4/config-3.4m -lpthread -ldl -lutil -lm -lpython3.4m -Xlinker -export-dynamic
|
||||
|
||||
.. note::
|
||||
To avoid confusion between several Python installations (and especially
|
||||
between the system Python and your own compiled Python), it is recommended
|
||||
that you use the absolute path to :file:`python{X.Y}-config`, as in the above
|
||||
example.
|
||||
|
||||
If this procedure doesn't work for you (it is not guaranteed to work for
|
||||
all Unix-like platforms; however, we welcome :ref:`bug reports <reporting-bugs>`)
|
||||
you will have to read your system's documentation about dynamic linking and/or
|
||||
examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename`
|
||||
to find its location) and compilation
|
||||
options. In this case, the :mod:`sysconfig` module is a useful tool to
|
||||
programmatically extract the configuration values that you will want to
|
||||
combine together. For example:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import sysconfig
|
||||
>>> sysconfig.get_config_var('LIBS')
|
||||
'-lpthread -ldl -lutil'
|
||||
>>> sysconfig.get_config_var('LINKFORSHARED')
|
||||
'-Xlinker -export-dynamic'
|
||||
|
||||
|
||||
.. XXX similar documentation for Windows missing
|
||||
1365
python-3.7.4-docs-html/_sources/extending/extending.rst.txt
Normal file
1365
python-3.7.4-docs-html/_sources/extending/extending.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
74
python-3.7.4-docs-html/_sources/extending/index.rst.txt
Normal file
74
python-3.7.4-docs-html/_sources/extending/index.rst.txt
Normal file
@@ -0,0 +1,74 @@
|
||||
.. _extending-index:
|
||||
|
||||
##################################################
|
||||
Extending and Embedding the Python Interpreter
|
||||
##################################################
|
||||
|
||||
This document describes how to write modules in C or C++ to extend the Python
|
||||
interpreter with new modules. Those modules can not only define new functions
|
||||
but also new object types and their methods. The document also describes how
|
||||
to embed the Python interpreter in another application, for use as an extension
|
||||
language. Finally, it shows how to compile and link extension modules so that
|
||||
they can be loaded dynamically (at run time) into the interpreter, if the
|
||||
underlying operating system supports this feature.
|
||||
|
||||
This document assumes basic knowledge about Python. For an informal
|
||||
introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index`
|
||||
gives a more formal definition of the language. :ref:`library-index` documents
|
||||
the existing object types, functions and modules (both built-in and written in
|
||||
Python) that give the language its wide application range.
|
||||
|
||||
For a detailed description of the whole Python/C API, see the separate
|
||||
:ref:`c-api-index`.
|
||||
|
||||
|
||||
Recommended third party tools
|
||||
=============================
|
||||
|
||||
This guide only covers the basic tools for creating extensions provided
|
||||
as part of this version of CPython. Third party tools like
|
||||
`Cython <http://cython.org/>`_, `cffi <https://cffi.readthedocs.io>`_,
|
||||
`SWIG <http://www.swig.org>`_ and `Numba <https://numba.pydata.org/>`_
|
||||
offer both simpler and more sophisticated approaches to creating C and C++
|
||||
extensions for Python.
|
||||
|
||||
.. seealso::
|
||||
|
||||
`Python Packaging User Guide: Binary Extensions <https://packaging.python.org/guides/packaging-binary-extensions/>`_
|
||||
The Python Packaging User Guide not only covers several available
|
||||
tools that simplify the creation of binary extensions, but also
|
||||
discusses the various reasons why creating an extension module may be
|
||||
desirable in the first place.
|
||||
|
||||
|
||||
Creating extensions without third party tools
|
||||
=============================================
|
||||
|
||||
This section of the guide covers creating C and C++ extensions without
|
||||
assistance from third party tools. It is intended primarily for creators
|
||||
of those tools, rather than being a recommended way to create your own
|
||||
C extensions.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:numbered:
|
||||
|
||||
extending.rst
|
||||
newtypes_tutorial.rst
|
||||
newtypes.rst
|
||||
building.rst
|
||||
windows.rst
|
||||
|
||||
Embedding the CPython runtime in a larger application
|
||||
=====================================================
|
||||
|
||||
Sometimes, rather than creating an extension that runs inside the Python
|
||||
interpreter as the main application, it is desirable to instead embed
|
||||
the CPython runtime inside a larger application. This section covers
|
||||
some of the details involved in doing that successfully.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:numbered:
|
||||
|
||||
embedding.rst
|
||||
619
python-3.7.4-docs-html/_sources/extending/newtypes.rst.txt
Normal file
619
python-3.7.4-docs-html/_sources/extending/newtypes.rst.txt
Normal file
@@ -0,0 +1,619 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
*****************************************
|
||||
Defining Extension Types: Assorted Topics
|
||||
*****************************************
|
||||
|
||||
.. _dnt-type-methods:
|
||||
|
||||
This section aims to give a quick fly-by on the various type methods you can
|
||||
implement and what they do.
|
||||
|
||||
Here is the definition of :c:type:`PyTypeObject`, with some fields only used in
|
||||
debug builds omitted:
|
||||
|
||||
.. literalinclude:: ../includes/typestruct.h
|
||||
|
||||
|
||||
Now that's a *lot* of methods. Don't worry too much though -- if you have
|
||||
a type you want to define, the chances are very good that you will only
|
||||
implement a handful of these.
|
||||
|
||||
As you probably expect by now, we're going to go over this and give more
|
||||
information about the various handlers. We won't go in the order they are
|
||||
defined in the structure, because there is a lot of historical baggage that
|
||||
impacts the ordering of the fields. It's often easiest to find an example
|
||||
that includes the fields you need and then change the values to suit your new
|
||||
type. ::
|
||||
|
||||
const char *tp_name; /* For printing */
|
||||
|
||||
The name of the type -- as mentioned in the previous chapter, this will appear in
|
||||
various places, almost entirely for diagnostic purposes. Try to choose something
|
||||
that will be helpful in such a situation! ::
|
||||
|
||||
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
|
||||
|
||||
These fields tell the runtime how much memory to allocate when new objects of
|
||||
this type are created. Python has some built-in support for variable length
|
||||
structures (think: strings, tuples) which is where the :c:member:`~PyTypeObject.tp_itemsize` field
|
||||
comes in. This will be dealt with later. ::
|
||||
|
||||
const char *tp_doc;
|
||||
|
||||
Here you can put a string (or its address) that you want returned when the
|
||||
Python script references ``obj.__doc__`` to retrieve the doc string.
|
||||
|
||||
Now we come to the basic type methods -- the ones most extension types will
|
||||
implement.
|
||||
|
||||
|
||||
Finalization and De-allocation
|
||||
------------------------------
|
||||
|
||||
.. index::
|
||||
single: object; deallocation
|
||||
single: deallocation, object
|
||||
single: object; finalization
|
||||
single: finalization, of objects
|
||||
|
||||
::
|
||||
|
||||
destructor tp_dealloc;
|
||||
|
||||
This function is called when the reference count of the instance of your type is
|
||||
reduced to zero and the Python interpreter wants to reclaim it. If your type
|
||||
has memory to free or other clean-up to perform, you can put it here. The
|
||||
object itself needs to be freed here as well. Here is an example of this
|
||||
function::
|
||||
|
||||
static void
|
||||
newdatatype_dealloc(newdatatypeobject *obj)
|
||||
{
|
||||
free(obj->obj_UnderlyingDatatypePtr);
|
||||
Py_TYPE(obj)->tp_free(obj);
|
||||
}
|
||||
|
||||
.. index::
|
||||
single: PyErr_Fetch()
|
||||
single: PyErr_Restore()
|
||||
|
||||
One important requirement of the deallocator function is that it leaves any
|
||||
pending exceptions alone. This is important since deallocators are frequently
|
||||
called as the interpreter unwinds the Python stack; when the stack is unwound
|
||||
due to an exception (rather than normal returns), nothing is done to protect the
|
||||
deallocators from seeing that an exception has already been set. Any actions
|
||||
which a deallocator performs which may cause additional Python code to be
|
||||
executed may detect that an exception has been set. This can lead to misleading
|
||||
errors from the interpreter. The proper way to protect against this is to save
|
||||
a pending exception before performing the unsafe action, and restoring it when
|
||||
done. This can be done using the :c:func:`PyErr_Fetch` and
|
||||
:c:func:`PyErr_Restore` functions::
|
||||
|
||||
static void
|
||||
my_dealloc(PyObject *obj)
|
||||
{
|
||||
MyObject *self = (MyObject *) obj;
|
||||
PyObject *cbresult;
|
||||
|
||||
if (self->my_callback != NULL) {
|
||||
PyObject *err_type, *err_value, *err_traceback;
|
||||
|
||||
/* This saves the current exception state */
|
||||
PyErr_Fetch(&err_type, &err_value, &err_traceback);
|
||||
|
||||
cbresult = PyObject_CallObject(self->my_callback, NULL);
|
||||
if (cbresult == NULL)
|
||||
PyErr_WriteUnraisable(self->my_callback);
|
||||
else
|
||||
Py_DECREF(cbresult);
|
||||
|
||||
/* This restores the saved exception state */
|
||||
PyErr_Restore(err_type, err_value, err_traceback);
|
||||
|
||||
Py_DECREF(self->my_callback);
|
||||
}
|
||||
Py_TYPE(obj)->tp_free((PyObject*)self);
|
||||
}
|
||||
|
||||
.. note::
|
||||
There are limitations to what you can safely do in a deallocator function.
|
||||
First, if your type supports garbage collection (using :c:member:`~PyTypeObject.tp_traverse`
|
||||
and/or :c:member:`~PyTypeObject.tp_clear`), some of the object's members can have been
|
||||
cleared or finalized by the time :c:member:`~PyTypeObject.tp_dealloc` is called. Second, in
|
||||
:c:member:`~PyTypeObject.tp_dealloc`, your object is in an unstable state: its reference
|
||||
count is equal to zero. Any call to a non-trivial object or API (as in the
|
||||
example above) might end up calling :c:member:`~PyTypeObject.tp_dealloc` again, causing a
|
||||
double free and a crash.
|
||||
|
||||
Starting with Python 3.4, it is recommended not to put any complex
|
||||
finalization code in :c:member:`~PyTypeObject.tp_dealloc`, and instead use the new
|
||||
:c:member:`~PyTypeObject.tp_finalize` type method.
|
||||
|
||||
.. seealso::
|
||||
:pep:`442` explains the new finalization scheme.
|
||||
|
||||
.. index::
|
||||
single: string; object representation
|
||||
builtin: repr
|
||||
|
||||
Object Presentation
|
||||
-------------------
|
||||
|
||||
In Python, there are two ways to generate a textual representation of an object:
|
||||
the :func:`repr` function, and the :func:`str` function. (The :func:`print`
|
||||
function just calls :func:`str`.) These handlers are both optional.
|
||||
|
||||
::
|
||||
|
||||
reprfunc tp_repr;
|
||||
reprfunc tp_str;
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_repr` handler should return a string object containing a
|
||||
representation of the instance for which it is called. Here is a simple
|
||||
example::
|
||||
|
||||
static PyObject *
|
||||
newdatatype_repr(newdatatypeobject * obj)
|
||||
{
|
||||
return PyUnicode_FromFormat("Repr-ified_newdatatype{{size:%d}}",
|
||||
obj->obj_UnderlyingDatatypePtr->size);
|
||||
}
|
||||
|
||||
If no :c:member:`~PyTypeObject.tp_repr` handler is specified, the interpreter will supply a
|
||||
representation that uses the type's :c:member:`~PyTypeObject.tp_name` and a uniquely-identifying
|
||||
value for the object.
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_str` handler is to :func:`str` what the :c:member:`~PyTypeObject.tp_repr` handler
|
||||
described above is to :func:`repr`; that is, it is called when Python code calls
|
||||
:func:`str` on an instance of your object. Its implementation is very similar
|
||||
to the :c:member:`~PyTypeObject.tp_repr` function, but the resulting string is intended for human
|
||||
consumption. If :c:member:`~PyTypeObject.tp_str` is not specified, the :c:member:`~PyTypeObject.tp_repr` handler is
|
||||
used instead.
|
||||
|
||||
Here is a simple example::
|
||||
|
||||
static PyObject *
|
||||
newdatatype_str(newdatatypeobject * obj)
|
||||
{
|
||||
return PyUnicode_FromFormat("Stringified_newdatatype{{size:%d}}",
|
||||
obj->obj_UnderlyingDatatypePtr->size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Attribute Management
|
||||
--------------------
|
||||
|
||||
For every object which can support attributes, the corresponding type must
|
||||
provide the functions that control how the attributes are resolved. There needs
|
||||
to be a function which can retrieve attributes (if any are defined), and another
|
||||
to set attributes (if setting attributes is allowed). Removing an attribute is
|
||||
a special case, for which the new value passed to the handler is *NULL*.
|
||||
|
||||
Python supports two pairs of attribute handlers; a type that supports attributes
|
||||
only needs to implement the functions for one pair. The difference is that one
|
||||
pair takes the name of the attribute as a :c:type:`char\*`, while the other
|
||||
accepts a :c:type:`PyObject\*`. Each type can use whichever pair makes more
|
||||
sense for the implementation's convenience. ::
|
||||
|
||||
getattrfunc tp_getattr; /* char * version */
|
||||
setattrfunc tp_setattr;
|
||||
/* ... */
|
||||
getattrofunc tp_getattro; /* PyObject * version */
|
||||
setattrofunc tp_setattro;
|
||||
|
||||
If accessing attributes of an object is always a simple operation (this will be
|
||||
explained shortly), there are generic implementations which can be used to
|
||||
provide the :c:type:`PyObject\*` version of the attribute management functions.
|
||||
The actual need for type-specific attribute handlers almost completely
|
||||
disappeared starting with Python 2.2, though there are many examples which have
|
||||
not been updated to use some of the new generic mechanism that is available.
|
||||
|
||||
|
||||
.. _generic-attribute-management:
|
||||
|
||||
Generic Attribute Management
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Most extension types only use *simple* attributes. So, what makes the
|
||||
attributes simple? There are only a couple of conditions that must be met:
|
||||
|
||||
#. The name of the attributes must be known when :c:func:`PyType_Ready` is
|
||||
called.
|
||||
|
||||
#. No special processing is needed to record that an attribute was looked up or
|
||||
set, nor do actions need to be taken based on the value.
|
||||
|
||||
Note that this list does not place any restrictions on the values of the
|
||||
attributes, when the values are computed, or how relevant data is stored.
|
||||
|
||||
When :c:func:`PyType_Ready` is called, it uses three tables referenced by the
|
||||
type object to create :term:`descriptor`\s which are placed in the dictionary of the
|
||||
type object. Each descriptor controls access to one attribute of the instance
|
||||
object. Each of the tables is optional; if all three are *NULL*, instances of
|
||||
the type will only have attributes that are inherited from their base type, and
|
||||
should leave the :c:member:`~PyTypeObject.tp_getattro` and :c:member:`~PyTypeObject.tp_setattro` fields *NULL* as
|
||||
well, allowing the base type to handle attributes.
|
||||
|
||||
The tables are declared as three fields of the type object::
|
||||
|
||||
struct PyMethodDef *tp_methods;
|
||||
struct PyMemberDef *tp_members;
|
||||
struct PyGetSetDef *tp_getset;
|
||||
|
||||
If :c:member:`~PyTypeObject.tp_methods` is not *NULL*, it must refer to an array of
|
||||
:c:type:`PyMethodDef` structures. Each entry in the table is an instance of this
|
||||
structure::
|
||||
|
||||
typedef struct PyMethodDef {
|
||||
const char *ml_name; /* method name */
|
||||
PyCFunction ml_meth; /* implementation function */
|
||||
int ml_flags; /* flags */
|
||||
const char *ml_doc; /* docstring */
|
||||
} PyMethodDef;
|
||||
|
||||
One entry should be defined for each method provided by the type; no entries are
|
||||
needed for methods inherited from a base type. One additional entry is needed
|
||||
at the end; it is a sentinel that marks the end of the array. The
|
||||
:attr:`ml_name` field of the sentinel must be *NULL*.
|
||||
|
||||
The second table is used to define attributes which map directly to data stored
|
||||
in the instance. A variety of primitive C types are supported, and access may
|
||||
be read-only or read-write. The structures in the table are defined as::
|
||||
|
||||
typedef struct PyMemberDef {
|
||||
const char *name;
|
||||
int type;
|
||||
int offset;
|
||||
int flags;
|
||||
const char *doc;
|
||||
} PyMemberDef;
|
||||
|
||||
For each entry in the table, a :term:`descriptor` will be constructed and added to the
|
||||
type which will be able to extract a value from the instance structure. The
|
||||
:attr:`type` field should contain one of the type codes defined in the
|
||||
:file:`structmember.h` header; the value will be used to determine how to
|
||||
convert Python values to and from C values. The :attr:`flags` field is used to
|
||||
store flags which control how the attribute can be accessed.
|
||||
|
||||
The following flag constants are defined in :file:`structmember.h`; they may be
|
||||
combined using bitwise-OR.
|
||||
|
||||
+---------------------------+----------------------------------------------+
|
||||
| Constant | Meaning |
|
||||
+===========================+==============================================+
|
||||
| :const:`READONLY` | Never writable. |
|
||||
+---------------------------+----------------------------------------------+
|
||||
| :const:`READ_RESTRICTED` | Not readable in restricted mode. |
|
||||
+---------------------------+----------------------------------------------+
|
||||
| :const:`WRITE_RESTRICTED` | Not writable in restricted mode. |
|
||||
+---------------------------+----------------------------------------------+
|
||||
| :const:`RESTRICTED` | Not readable or writable in restricted mode. |
|
||||
+---------------------------+----------------------------------------------+
|
||||
|
||||
.. index::
|
||||
single: READONLY
|
||||
single: READ_RESTRICTED
|
||||
single: WRITE_RESTRICTED
|
||||
single: RESTRICTED
|
||||
|
||||
An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` table to build
|
||||
descriptors that are used at runtime is that any attribute defined this way can
|
||||
have an associated doc string simply by providing the text in the table. An
|
||||
application can use the introspection API to retrieve the descriptor from the
|
||||
class object, and get the doc string using its :attr:`__doc__` attribute.
|
||||
|
||||
As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :attr:`name` value
|
||||
of *NULL* is required.
|
||||
|
||||
.. XXX Descriptors need to be explained in more detail somewhere, but not here.
|
||||
|
||||
Descriptor objects have two handler functions which correspond to the
|
||||
\member{tp_getattro} and \member{tp_setattro} handlers. The
|
||||
\method{__get__()} handler is a function which is passed the descriptor,
|
||||
instance, and type objects, and returns the value of the attribute, or it
|
||||
returns \NULL{} and sets an exception. The \method{__set__()} handler is
|
||||
passed the descriptor, instance, type, and new value;
|
||||
|
||||
|
||||
Type-specific Attribute Management
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For simplicity, only the :c:type:`char\*` version will be demonstrated here; the
|
||||
type of the name parameter is the only difference between the :c:type:`char\*`
|
||||
and :c:type:`PyObject\*` flavors of the interface. This example effectively does
|
||||
the same thing as the generic example above, but does not use the generic
|
||||
support added in Python 2.2. It explains how the handler functions are
|
||||
called, so that if you do need to extend their functionality, you'll understand
|
||||
what needs to be done.
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_getattr` handler is called when the object requires an attribute
|
||||
look-up. It is called in the same situations where the :meth:`__getattr__`
|
||||
method of a class would be called.
|
||||
|
||||
Here is an example::
|
||||
|
||||
static PyObject *
|
||||
newdatatype_getattr(newdatatypeobject *obj, char *name)
|
||||
{
|
||||
if (strcmp(name, "data") == 0)
|
||||
{
|
||||
return PyLong_FromLong(obj->data);
|
||||
}
|
||||
|
||||
PyErr_Format(PyExc_AttributeError,
|
||||
"'%.50s' object has no attribute '%.400s'",
|
||||
tp->tp_name, name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_setattr` handler is called when the :meth:`__setattr__` or
|
||||
:meth:`__delattr__` method of a class instance would be called. When an
|
||||
attribute should be deleted, the third parameter will be *NULL*. Here is an
|
||||
example that simply raises an exception; if this were really all you wanted, the
|
||||
:c:member:`~PyTypeObject.tp_setattr` handler should be set to *NULL*. ::
|
||||
|
||||
static int
|
||||
newdatatype_setattr(newdatatypeobject *obj, char *name, PyObject *v)
|
||||
{
|
||||
PyErr_Format(PyExc_RuntimeError, "Read-only attribute: %s", name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
Object Comparison
|
||||
-----------------
|
||||
|
||||
::
|
||||
|
||||
richcmpfunc tp_richcompare;
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_richcompare` handler is called when comparisons are needed. It is
|
||||
analogous to the :ref:`rich comparison methods <richcmpfuncs>`, like
|
||||
:meth:`__lt__`, and also called by :c:func:`PyObject_RichCompare` and
|
||||
:c:func:`PyObject_RichCompareBool`.
|
||||
|
||||
This function is called with two Python objects and the operator as arguments,
|
||||
where the operator is one of ``Py_EQ``, ``Py_NE``, ``Py_LE``, ``Py_GT``,
|
||||
``Py_LT`` or ``Py_GT``. It should compare the two objects with respect to the
|
||||
specified operator and return ``Py_True`` or ``Py_False`` if the comparison is
|
||||
successful, ``Py_NotImplemented`` to indicate that comparison is not
|
||||
implemented and the other object's comparison method should be tried, or *NULL*
|
||||
if an exception was set.
|
||||
|
||||
Here is a sample implementation, for a datatype that is considered equal if the
|
||||
size of an internal pointer is equal::
|
||||
|
||||
static PyObject *
|
||||
newdatatype_richcmp(PyObject *obj1, PyObject *obj2, int op)
|
||||
{
|
||||
PyObject *result;
|
||||
int c, size1, size2;
|
||||
|
||||
/* code to make sure that both arguments are of type
|
||||
newdatatype omitted */
|
||||
|
||||
size1 = obj1->obj_UnderlyingDatatypePtr->size;
|
||||
size2 = obj2->obj_UnderlyingDatatypePtr->size;
|
||||
|
||||
switch (op) {
|
||||
case Py_LT: c = size1 < size2; break;
|
||||
case Py_LE: c = size1 <= size2; break;
|
||||
case Py_EQ: c = size1 == size2; break;
|
||||
case Py_NE: c = size1 != size2; break;
|
||||
case Py_GT: c = size1 > size2; break;
|
||||
case Py_GE: c = size1 >= size2; break;
|
||||
}
|
||||
result = c ? Py_True : Py_False;
|
||||
Py_INCREF(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Abstract Protocol Support
|
||||
-------------------------
|
||||
|
||||
Python supports a variety of *abstract* 'protocols;' the specific interfaces
|
||||
provided to use these interfaces are documented in :ref:`abstract`.
|
||||
|
||||
|
||||
A number of these abstract interfaces were defined early in the development of
|
||||
the Python implementation. In particular, the number, mapping, and sequence
|
||||
protocols have been part of Python since the beginning. Other protocols have
|
||||
been added over time. For protocols which depend on several handler routines
|
||||
from the type implementation, the older protocols have been defined as optional
|
||||
blocks of handlers referenced by the type object. For newer protocols there are
|
||||
additional slots in the main type object, with a flag bit being set to indicate
|
||||
that the slots are present and should be checked by the interpreter. (The flag
|
||||
bit does not indicate that the slot values are non-*NULL*. The flag may be set
|
||||
to indicate the presence of a slot, but a slot may still be unfilled.) ::
|
||||
|
||||
PyNumberMethods *tp_as_number;
|
||||
PySequenceMethods *tp_as_sequence;
|
||||
PyMappingMethods *tp_as_mapping;
|
||||
|
||||
If you wish your object to be able to act like a number, a sequence, or a
|
||||
mapping object, then you place the address of a structure that implements the C
|
||||
type :c:type:`PyNumberMethods`, :c:type:`PySequenceMethods`, or
|
||||
:c:type:`PyMappingMethods`, respectively. It is up to you to fill in this
|
||||
structure with appropriate values. You can find examples of the use of each of
|
||||
these in the :file:`Objects` directory of the Python source distribution. ::
|
||||
|
||||
hashfunc tp_hash;
|
||||
|
||||
This function, if you choose to provide it, should return a hash number for an
|
||||
instance of your data type. Here is a simple example::
|
||||
|
||||
static Py_hash_t
|
||||
newdatatype_hash(newdatatypeobject *obj)
|
||||
{
|
||||
Py_hash_t result;
|
||||
result = obj->some_size + 32767 * obj->some_number;
|
||||
if (result == -1)
|
||||
result = -2;
|
||||
return result;
|
||||
}
|
||||
|
||||
:c:type:`Py_hash_t` is a signed integer type with a platform-varying width.
|
||||
Returning ``-1`` from :c:member:`~PyTypeObject.tp_hash` indicates an error,
|
||||
which is why you should be careful to avoid returning it when hash computation
|
||||
is successful, as seen above.
|
||||
|
||||
::
|
||||
|
||||
ternaryfunc tp_call;
|
||||
|
||||
This function is called when an instance of your data type is "called", for
|
||||
example, if ``obj1`` is an instance of your data type and the Python script
|
||||
contains ``obj1('hello')``, the :c:member:`~PyTypeObject.tp_call` handler is invoked.
|
||||
|
||||
This function takes three arguments:
|
||||
|
||||
#. *self* is the instance of the data type which is the subject of the call.
|
||||
If the call is ``obj1('hello')``, then *self* is ``obj1``.
|
||||
|
||||
#. *args* is a tuple containing the arguments to the call. You can use
|
||||
:c:func:`PyArg_ParseTuple` to extract the arguments.
|
||||
|
||||
#. *kwds* is a dictionary of keyword arguments that were passed. If this is
|
||||
non-*NULL* and you support keyword arguments, use
|
||||
:c:func:`PyArg_ParseTupleAndKeywords` to extract the arguments. If you
|
||||
do not want to support keyword arguments and this is non-*NULL*, raise a
|
||||
:exc:`TypeError` with a message saying that keyword arguments are not supported.
|
||||
|
||||
Here is a toy ``tp_call`` implementation::
|
||||
|
||||
static PyObject *
|
||||
newdatatype_call(newdatatypeobject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
PyObject *result;
|
||||
const char *arg1;
|
||||
const char *arg2;
|
||||
const char *arg3;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "sss:call", &arg1, &arg2, &arg3)) {
|
||||
return NULL;
|
||||
}
|
||||
result = PyUnicode_FromFormat(
|
||||
"Returning -- value: [%d] arg1: [%s] arg2: [%s] arg3: [%s]\n",
|
||||
obj->obj_UnderlyingDatatypePtr->size,
|
||||
arg1, arg2, arg3);
|
||||
return result;
|
||||
}
|
||||
|
||||
::
|
||||
|
||||
/* Iterators */
|
||||
getiterfunc tp_iter;
|
||||
iternextfunc tp_iternext;
|
||||
|
||||
These functions provide support for the iterator protocol. Both handlers
|
||||
take exactly one parameter, the instance for which they are being called,
|
||||
and return a new reference. In the case of an error, they should set an
|
||||
exception and return *NULL*. :c:member:`~PyTypeObject.tp_iter` corresponds
|
||||
to the Python :meth:`__iter__` method, while :c:member:`~PyTypeObject.tp_iternext`
|
||||
corresponds to the Python :meth:`~iterator.__next__` method.
|
||||
|
||||
Any :term:`iterable` object must implement the :c:member:`~PyTypeObject.tp_iter`
|
||||
handler, which must return an :term:`iterator` object. Here the same guidelines
|
||||
apply as for Python classes:
|
||||
|
||||
* For collections (such as lists and tuples) which can support multiple
|
||||
independent iterators, a new iterator should be created and returned by
|
||||
each call to :c:member:`~PyTypeObject.tp_iter`.
|
||||
* Objects which can only be iterated over once (usually due to side effects of
|
||||
iteration, such as file objects) can implement :c:member:`~PyTypeObject.tp_iter`
|
||||
by returning a new reference to themselves -- and should also therefore
|
||||
implement the :c:member:`~PyTypeObject.tp_iternext` handler.
|
||||
|
||||
Any :term:`iterator` object should implement both :c:member:`~PyTypeObject.tp_iter`
|
||||
and :c:member:`~PyTypeObject.tp_iternext`. An iterator's
|
||||
:c:member:`~PyTypeObject.tp_iter` handler should return a new reference
|
||||
to the iterator. Its :c:member:`~PyTypeObject.tp_iternext` handler should
|
||||
return a new reference to the next object in the iteration, if there is one.
|
||||
If the iteration has reached the end, :c:member:`~PyTypeObject.tp_iternext`
|
||||
may return *NULL* without setting an exception, or it may set
|
||||
:exc:`StopIteration` *in addition* to returning *NULL*; avoiding
|
||||
the exception can yield slightly better performance. If an actual error
|
||||
occurs, :c:member:`~PyTypeObject.tp_iternext` should always set an exception
|
||||
and return *NULL*.
|
||||
|
||||
|
||||
.. _weakref-support:
|
||||
|
||||
Weak Reference Support
|
||||
----------------------
|
||||
|
||||
One of the goals of Python's weak reference implementation is to allow any type
|
||||
to participate in the weak reference mechanism without incurring the overhead on
|
||||
performance-critical objects (such as numbers).
|
||||
|
||||
.. seealso::
|
||||
Documentation for the :mod:`weakref` module.
|
||||
|
||||
For an object to be weakly referencable, the extension type must do two things:
|
||||
|
||||
#. Include a :c:type:`PyObject\*` field in the C object structure dedicated to
|
||||
the weak reference mechanism. The object's constructor should leave it
|
||||
*NULL* (which is automatic when using the default
|
||||
:c:member:`~PyTypeObject.tp_alloc`).
|
||||
|
||||
#. Set the :c:member:`~PyTypeObject.tp_weaklistoffset` type member
|
||||
to the offset of the aforementioned field in the C object structure,
|
||||
so that the interpreter knows how to access and modify that field.
|
||||
|
||||
Concretely, here is how a trivial object structure would be augmented
|
||||
with the required field::
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *weakreflist; /* List of weak references */
|
||||
} TrivialObject;
|
||||
|
||||
And the corresponding member in the statically-declared type object::
|
||||
|
||||
static PyTypeObject TrivialType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
/* ... other members omitted for brevity ... */
|
||||
.tp_weaklistoffset = offsetof(TrivialObject, weakreflist),
|
||||
};
|
||||
|
||||
The only further addition is that ``tp_dealloc`` needs to clear any weak
|
||||
references (by calling :c:func:`PyObject_ClearWeakRefs`) if the field is
|
||||
non-*NULL*::
|
||||
|
||||
static void
|
||||
Trivial_dealloc(TrivialObject *self)
|
||||
{
|
||||
/* Clear weakrefs first before calling any destructors */
|
||||
if (self->weakreflist != NULL)
|
||||
PyObject_ClearWeakRefs((PyObject *) self);
|
||||
/* ... remainder of destruction code omitted for brevity ... */
|
||||
Py_TYPE(self)->tp_free((PyObject *) self);
|
||||
}
|
||||
|
||||
|
||||
More Suggestions
|
||||
----------------
|
||||
|
||||
In order to learn how to implement any specific method for your new data type,
|
||||
get the :term:`CPython` source code. Go to the :file:`Objects` directory,
|
||||
then search the C source files for ``tp_`` plus the function you want
|
||||
(for example, ``tp_richcompare``). You will find examples of the function
|
||||
you want to implement.
|
||||
|
||||
When you need to verify that an object is a concrete instance of the type you
|
||||
are implementing, use the :c:func:`PyObject_TypeCheck` function. A sample of
|
||||
its use might be something like the following::
|
||||
|
||||
if (!PyObject_TypeCheck(some_object, &MyType)) {
|
||||
PyErr_SetString(PyExc_TypeError, "arg #1 not a mything");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
.. seealso::
|
||||
Download CPython source releases.
|
||||
https://www.python.org/downloads/source/
|
||||
|
||||
The CPython project on GitHub, where the CPython source code is developed.
|
||||
https://github.com/python/cpython
|
||||
@@ -0,0 +1,897 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _defining-new-types:
|
||||
|
||||
**********************************
|
||||
Defining Extension Types: Tutorial
|
||||
**********************************
|
||||
|
||||
.. sectionauthor:: Michael Hudson <mwh@python.net>
|
||||
.. sectionauthor:: Dave Kuhlman <dkuhlman@rexx.com>
|
||||
.. sectionauthor:: Jim Fulton <jim@zope.com>
|
||||
|
||||
|
||||
Python allows the writer of a C extension module to define new types that
|
||||
can be manipulated from Python code, much like the built-in :class:`str`
|
||||
and :class:`list` types. The code for all extension types follows a
|
||||
pattern, but there are some details that you need to understand before you
|
||||
can get started. This document is a gentle introduction to the topic.
|
||||
|
||||
|
||||
.. _dnt-basics:
|
||||
|
||||
The Basics
|
||||
==========
|
||||
|
||||
The :term:`CPython` runtime sees all Python objects as variables of type
|
||||
:c:type:`PyObject\*`, which serves as a "base type" for all Python objects.
|
||||
The :c:type:`PyObject` structure itself only contains the object's
|
||||
:term:`reference count` and a pointer to the object's "type object".
|
||||
This is where the action is; the type object determines which (C) functions
|
||||
get called by the interpreter when, for instance, an attribute gets looked up
|
||||
on an object, a method called, or it is multiplied by another object. These
|
||||
C functions are called "type methods".
|
||||
|
||||
So, if you want to define a new extension type, you need to create a new type
|
||||
object.
|
||||
|
||||
This sort of thing can only be explained by example, so here's a minimal, but
|
||||
complete, module that defines a new type named :class:`Custom` inside a C
|
||||
extension module :mod:`custom`:
|
||||
|
||||
.. note::
|
||||
What we're showing here is the traditional way of defining *static*
|
||||
extension types. It should be adequate for most uses. The C API also
|
||||
allows defining heap-allocated extension types using the
|
||||
:c:func:`PyType_FromSpec` function, which isn't covered in this tutorial.
|
||||
|
||||
.. literalinclude:: ../includes/custom.c
|
||||
|
||||
Now that's quite a bit to take in at once, but hopefully bits will seem familiar
|
||||
from the previous chapter. This file defines three things:
|
||||
|
||||
#. What a :class:`Custom` **object** contains: this is the ``CustomObject``
|
||||
struct, which is allocated once for each :class:`Custom` instance.
|
||||
#. How the :class:`Custom` **type** behaves: this is the ``CustomType`` struct,
|
||||
which defines a set of flags and function pointers that the interpreter
|
||||
inspects when specific operations are requested.
|
||||
#. How to initialize the :mod:`custom` module: this is the ``PyInit_custom``
|
||||
function and the associated ``custommodule`` struct.
|
||||
|
||||
The first bit is::
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
} CustomObject;
|
||||
|
||||
This is what a Custom object will contain. ``PyObject_HEAD`` is mandatory
|
||||
at the start of each object struct and defines a field called ``ob_base``
|
||||
of type :c:type:`PyObject`, containing a pointer to a type object and a
|
||||
reference count (these can be accessed using the macros :c:macro:`Py_REFCNT`
|
||||
and :c:macro:`Py_TYPE` respectively). The reason for the macro is to
|
||||
abstract away the layout and to enable additional fields in debug builds.
|
||||
|
||||
.. note::
|
||||
There is no semicolon above after the :c:macro:`PyObject_HEAD` macro.
|
||||
Be wary of adding one by accident: some compilers will complain.
|
||||
|
||||
Of course, objects generally store additional data besides the standard
|
||||
``PyObject_HEAD`` boilerplate; for example, here is the definition for
|
||||
standard Python floats::
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
double ob_fval;
|
||||
} PyFloatObject;
|
||||
|
||||
The second bit is the definition of the type object. ::
|
||||
|
||||
static PyTypeObject CustomType = {
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
.tp_name = "custom.Custom",
|
||||
.tp_doc = "Custom objects",
|
||||
.tp_basicsize = sizeof(CustomObject),
|
||||
.tp_itemsize = 0,
|
||||
.tp_flags = Py_TPFLAGS_DEFAULT,
|
||||
.tp_new = PyType_GenericNew,
|
||||
};
|
||||
|
||||
.. note::
|
||||
We recommend using C99-style designated initializers as above, to
|
||||
avoid listing all the :c:type:`PyTypeObject` fields that you don't care
|
||||
about and also to avoid caring about the fields' declaration order.
|
||||
|
||||
The actual definition of :c:type:`PyTypeObject` in :file:`object.h` has
|
||||
many more :ref:`fields <type-structs>` than the definition above. The
|
||||
remaining fields will be filled with zeros by the C compiler, and it's
|
||||
common practice to not specify them explicitly unless you need them.
|
||||
|
||||
We're going to pick it apart, one field at a time::
|
||||
|
||||
PyVarObject_HEAD_INIT(NULL, 0)
|
||||
|
||||
This line is mandatory boilerplate to initialize the ``ob_base``
|
||||
field mentioned above. ::
|
||||
|
||||
.tp_name = "custom.Custom",
|
||||
|
||||
The name of our type. This will appear in the default textual representation of
|
||||
our objects and in some error messages, for example:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> "" + custom.Custom()
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
TypeError: can only concatenate str (not "custom.Custom") to str
|
||||
|
||||
Note that the name is a dotted name that includes both the module name and the
|
||||
name of the type within the module. The module in this case is :mod:`custom` and
|
||||
the type is :class:`Custom`, so we set the type name to :class:`custom.Custom`.
|
||||
Using the real dotted import path is important to make your type compatible
|
||||
with the :mod:`pydoc` and :mod:`pickle` modules. ::
|
||||
|
||||
.tp_basicsize = sizeof(CustomObject),
|
||||
.tp_itemsize = 0,
|
||||
|
||||
This is so that Python knows how much memory to allocate when creating
|
||||
new :class:`Custom` instances. :c:member:`~PyTypeObject.tp_itemsize` is
|
||||
only used for variable-sized objects and should otherwise be zero.
|
||||
|
||||
.. note::
|
||||
|
||||
If you want your type to be subclassable from Python, and your type has the same
|
||||
:c:member:`~PyTypeObject.tp_basicsize` as its base type, you may have problems with multiple
|
||||
inheritance. A Python subclass of your type will have to list your type first
|
||||
in its :attr:`~class.__bases__`, or else it will not be able to call your type's
|
||||
:meth:`__new__` method without getting an error. You can avoid this problem by
|
||||
ensuring that your type has a larger value for :c:member:`~PyTypeObject.tp_basicsize` than its
|
||||
base type does. Most of the time, this will be true anyway, because either your
|
||||
base type will be :class:`object`, or else you will be adding data members to
|
||||
your base type, and therefore increasing its size.
|
||||
|
||||
We set the class flags to :const:`Py_TPFLAGS_DEFAULT`. ::
|
||||
|
||||
.tp_flags = Py_TPFLAGS_DEFAULT,
|
||||
|
||||
All types should include this constant in their flags. It enables all of the
|
||||
members defined until at least Python 3.3. If you need further members,
|
||||
you will need to OR the corresponding flags.
|
||||
|
||||
We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. ::
|
||||
|
||||
.tp_doc = "Custom objects",
|
||||
|
||||
To enable object creation, we have to provide a :c:member:`~PyTypeObject.tp_new`
|
||||
handler. This is the equivalent of the Python method :meth:`__new__`, but
|
||||
has to be specified explicitly. In this case, we can just use the default
|
||||
implementation provided by the API function :c:func:`PyType_GenericNew`. ::
|
||||
|
||||
.tp_new = PyType_GenericNew,
|
||||
|
||||
Everything else in the file should be familiar, except for some code in
|
||||
:c:func:`PyInit_custom`::
|
||||
|
||||
if (PyType_Ready(&CustomType) < 0)
|
||||
return;
|
||||
|
||||
This initializes the :class:`Custom` type, filling in a number of members
|
||||
to the appropriate default values, including :attr:`ob_type` that we initially
|
||||
set to *NULL*. ::
|
||||
|
||||
PyModule_AddObject(m, "Custom", (PyObject *) &CustomType);
|
||||
|
||||
This adds the type to the module dictionary. This allows us to create
|
||||
:class:`Custom` instances by calling the :class:`Custom` class:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import custom
|
||||
>>> mycustom = custom.Custom()
|
||||
|
||||
That's it! All that remains is to build it; put the above code in a file called
|
||||
:file:`custom.c` and:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
setup(name="custom", version="1.0",
|
||||
ext_modules=[Extension("custom", ["custom.c"])])
|
||||
|
||||
in a file called :file:`setup.py`; then typing
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python setup.py build
|
||||
|
||||
at a shell should produce a file :file:`custom.so` in a subdirectory; move to
|
||||
that directory and fire up Python --- you should be able to ``import custom`` and
|
||||
play around with Custom objects.
|
||||
|
||||
That wasn't so hard, was it?
|
||||
|
||||
Of course, the current Custom type is pretty uninteresting. It has no data and
|
||||
doesn't do anything. It can't even be subclassed.
|
||||
|
||||
.. note::
|
||||
While this documentation showcases the standard :mod:`distutils` module
|
||||
for building C extensions, it is recommended in real-world use cases to
|
||||
use the newer and better-maintained ``setuptools`` library. Documentation
|
||||
on how to do this is out of scope for this document and can be found in
|
||||
the `Python Packaging User's Guide <https://packaging.python.org/tutorials/distributing-packages/>`_.
|
||||
|
||||
|
||||
Adding data and methods to the Basic example
|
||||
============================================
|
||||
|
||||
Let's extend the basic example to add some data and methods. Let's also make
|
||||
the type usable as a base class. We'll create a new module, :mod:`custom2` that
|
||||
adds these capabilities:
|
||||
|
||||
.. literalinclude:: ../includes/custom2.c
|
||||
|
||||
|
||||
This version of the module has a number of changes.
|
||||
|
||||
We've added an extra include::
|
||||
|
||||
#include <structmember.h>
|
||||
|
||||
This include provides declarations that we use to handle attributes, as
|
||||
described a bit later.
|
||||
|
||||
The :class:`Custom` type now has three data attributes in its C struct,
|
||||
*first*, *last*, and *number*. The *first* and *last* variables are Python
|
||||
strings containing first and last names. The *number* attribute is a C integer.
|
||||
|
||||
The object structure is updated accordingly::
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
PyObject *first; /* first name */
|
||||
PyObject *last; /* last name */
|
||||
int number;
|
||||
} CustomObject;
|
||||
|
||||
Because we now have data to manage, we have to be more careful about object
|
||||
allocation and deallocation. At a minimum, we need a deallocation method::
|
||||
|
||||
static void
|
||||
Custom_dealloc(CustomObject *self)
|
||||
{
|
||||
Py_XDECREF(self->first);
|
||||
Py_XDECREF(self->last);
|
||||
Py_TYPE(self)->tp_free((PyObject *) self);
|
||||
}
|
||||
|
||||
which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::
|
||||
|
||||
.tp_dealloc = (destructor) Custom_dealloc,
|
||||
|
||||
This method first clears the reference counts of the two Python attributes.
|
||||
:c:func:`Py_XDECREF` correctly handles the case where its argument is
|
||||
*NULL* (which might happen here if ``tp_new`` failed midway). It then
|
||||
calls the :c:member:`~PyTypeObject.tp_free` member of the object's type
|
||||
(computed by ``Py_TYPE(self)``) to free the object's memory. Note that
|
||||
the object's type might not be :class:`CustomType`, because the object may
|
||||
be an instance of a subclass.
|
||||
|
||||
.. note::
|
||||
The explicit cast to ``destructor`` above is needed because we defined
|
||||
``Custom_dealloc`` to take a ``CustomObject *`` argument, but the ``tp_dealloc``
|
||||
function pointer expects to receive a ``PyObject *`` argument. Otherwise,
|
||||
the compiler will emit a warning. This is object-oriented polymorphism,
|
||||
in C!
|
||||
|
||||
We want to make sure that the first and last names are initialized to empty
|
||||
strings, so we provide a ``tp_new`` implementation::
|
||||
|
||||
static PyObject *
|
||||
Custom_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
CustomObject *self;
|
||||
self = (CustomObject *) type->tp_alloc(type, 0);
|
||||
if (self != NULL) {
|
||||
self->first = PyUnicode_FromString("");
|
||||
if (self->first == NULL) {
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
self->last = PyUnicode_FromString("");
|
||||
if (self->last == NULL) {
|
||||
Py_DECREF(self);
|
||||
return NULL;
|
||||
}
|
||||
self->number = 0;
|
||||
}
|
||||
return (PyObject *) self;
|
||||
}
|
||||
|
||||
and install it in the :c:member:`~PyTypeObject.tp_new` member::
|
||||
|
||||
.tp_new = Custom_new,
|
||||
|
||||
The ``tp_new`` handler is responsible for creating (as opposed to initializing)
|
||||
objects of the type. It is exposed in Python as the :meth:`__new__` method.
|
||||
It is not required to define a ``tp_new`` member, and indeed many extension
|
||||
types will simply reuse :c:func:`PyType_GenericNew` as done in the first
|
||||
version of the ``Custom`` type above. In this case, we use the ``tp_new``
|
||||
handler to initialize the ``first`` and ``last`` attributes to non-*NULL*
|
||||
default values.
|
||||
|
||||
``tp_new`` is passed the type being instantiated (not necessarily ``CustomType``,
|
||||
if a subclass is instantiated) and any arguments passed when the type was
|
||||
called, and is expected to return the instance created. ``tp_new`` handlers
|
||||
always accept positional and keyword arguments, but they often ignore the
|
||||
arguments, leaving the argument handling to initializer (a.k.a. ``tp_init``
|
||||
in C or ``__init__`` in Python) methods.
|
||||
|
||||
.. note::
|
||||
``tp_new`` shouldn't call ``tp_init`` explicitly, as the interpreter
|
||||
will do it itself.
|
||||
|
||||
The ``tp_new`` implementation calls the :c:member:`~PyTypeObject.tp_alloc`
|
||||
slot to allocate memory::
|
||||
|
||||
self = (CustomObject *) type->tp_alloc(type, 0);
|
||||
|
||||
Since memory allocation may fail, we must check the :c:member:`~PyTypeObject.tp_alloc`
|
||||
result against *NULL* before proceeding.
|
||||
|
||||
.. note::
|
||||
We didn't fill the :c:member:`~PyTypeObject.tp_alloc` slot ourselves. Rather
|
||||
:c:func:`PyType_Ready` fills it for us by inheriting it from our base class,
|
||||
which is :class:`object` by default. Most types use the default allocation
|
||||
strategy.
|
||||
|
||||
.. note::
|
||||
If you are creating a co-operative :c:member:`~PyTypeObject.tp_new` (one
|
||||
that calls a base type's :c:member:`~PyTypeObject.tp_new` or :meth:`__new__`),
|
||||
you must *not* try to determine what method to call using method resolution
|
||||
order at runtime. Always statically determine what type you are going to
|
||||
call, and call its :c:member:`~PyTypeObject.tp_new` directly, or via
|
||||
``type->tp_base->tp_new``. If you do not do this, Python subclasses of your
|
||||
type that also inherit from other Python-defined classes may not work correctly.
|
||||
(Specifically, you may not be able to create instances of such subclasses
|
||||
without getting a :exc:`TypeError`.)
|
||||
|
||||
We also define an initialization function which accepts arguments to provide
|
||||
initial values for our instance::
|
||||
|
||||
static int
|
||||
Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
static char *kwlist[] = {"first", "last", "number", NULL};
|
||||
PyObject *first = NULL, *last = NULL, *tmp;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist,
|
||||
&first, &last,
|
||||
&self->number))
|
||||
return -1;
|
||||
|
||||
if (first) {
|
||||
tmp = self->first;
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
if (last) {
|
||||
tmp = self->last;
|
||||
Py_INCREF(last);
|
||||
self->last = last;
|
||||
Py_XDECREF(tmp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
by filling the :c:member:`~PyTypeObject.tp_init` slot. ::
|
||||
|
||||
.tp_init = (initproc) Custom_init,
|
||||
|
||||
The :c:member:`~PyTypeObject.tp_init` slot is exposed in Python as the
|
||||
:meth:`__init__` method. It is used to initialize an object after it's
|
||||
created. Initializers always accept positional and keyword arguments,
|
||||
and they should return either ``0`` on success or ``-1`` on error.
|
||||
|
||||
Unlike the ``tp_new`` handler, there is no guarantee that ``tp_init``
|
||||
is called at all (for example, the :mod:`pickle` module by default
|
||||
doesn't call :meth:`__init__` on unpickled instances). It can also be
|
||||
called multiple times. Anyone can call the :meth:`__init__` method on
|
||||
our objects. For this reason, we have to be extra careful when assigning
|
||||
the new attribute values. We might be tempted, for example to assign the
|
||||
``first`` member like this::
|
||||
|
||||
if (first) {
|
||||
Py_XDECREF(self->first);
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
}
|
||||
|
||||
But this would be risky. Our type doesn't restrict the type of the
|
||||
``first`` member, so it could be any kind of object. It could have a
|
||||
destructor that causes code to be executed that tries to access the
|
||||
``first`` member; or that destructor could release the
|
||||
:term:`Global interpreter Lock` and let arbitrary code run in other
|
||||
threads that accesses and modifies our object.
|
||||
|
||||
To be paranoid and protect ourselves against this possibility, we almost
|
||||
always reassign members before decrementing their reference counts. When
|
||||
don't we have to do this?
|
||||
|
||||
* when we absolutely know that the reference count is greater than 1;
|
||||
|
||||
* when we know that deallocation of the object [#]_ will neither release
|
||||
the :term:`GIL` nor cause any calls back into our type's code;
|
||||
|
||||
* when decrementing a reference count in a :c:member:`~PyTypeObject.tp_dealloc`
|
||||
handler on a type which doesn't support cyclic garbage collection [#]_.
|
||||
|
||||
We want to expose our instance variables as attributes. There are a
|
||||
number of ways to do that. The simplest way is to define member definitions::
|
||||
|
||||
static PyMemberDef Custom_members[] = {
|
||||
{"first", T_OBJECT_EX, offsetof(CustomObject, first), 0,
|
||||
"first name"},
|
||||
{"last", T_OBJECT_EX, offsetof(CustomObject, last), 0,
|
||||
"last name"},
|
||||
{"number", T_INT, offsetof(CustomObject, number), 0,
|
||||
"custom number"},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
and put the definitions in the :c:member:`~PyTypeObject.tp_members` slot::
|
||||
|
||||
.tp_members = Custom_members,
|
||||
|
||||
Each member definition has a member name, type, offset, access flags and
|
||||
documentation string. See the :ref:`Generic-Attribute-Management` section
|
||||
below for details.
|
||||
|
||||
A disadvantage of this approach is that it doesn't provide a way to restrict the
|
||||
types of objects that can be assigned to the Python attributes. We expect the
|
||||
first and last names to be strings, but any Python objects can be assigned.
|
||||
Further, the attributes can be deleted, setting the C pointers to *NULL*. Even
|
||||
though we can make sure the members are initialized to non-*NULL* values, the
|
||||
members can be set to *NULL* if the attributes are deleted.
|
||||
|
||||
We define a single method, :meth:`Custom.name()`, that outputs the objects name as the
|
||||
concatenation of the first and last names. ::
|
||||
|
||||
static PyObject *
|
||||
Custom_name(CustomObject *self)
|
||||
{
|
||||
if (self->first == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "first");
|
||||
return NULL;
|
||||
}
|
||||
if (self->last == NULL) {
|
||||
PyErr_SetString(PyExc_AttributeError, "last");
|
||||
return NULL;
|
||||
}
|
||||
return PyUnicode_FromFormat("%S %S", self->first, self->last);
|
||||
}
|
||||
|
||||
The method is implemented as a C function that takes a :class:`Custom` (or
|
||||
:class:`Custom` subclass) instance as the first argument. Methods always take an
|
||||
instance as the first argument. Methods often take positional and keyword
|
||||
arguments as well, but in this case we don't take any and don't need to accept
|
||||
a positional argument tuple or keyword argument dictionary. This method is
|
||||
equivalent to the Python method:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
def name(self):
|
||||
return "%s %s" % (self.first, self.last)
|
||||
|
||||
Note that we have to check for the possibility that our :attr:`first` and
|
||||
:attr:`last` members are *NULL*. This is because they can be deleted, in which
|
||||
case they are set to *NULL*. It would be better to prevent deletion of these
|
||||
attributes and to restrict the attribute values to be strings. We'll see how to
|
||||
do that in the next section.
|
||||
|
||||
Now that we've defined the method, we need to create an array of method
|
||||
definitions::
|
||||
|
||||
static PyMethodDef Custom_methods[] = {
|
||||
{"name", (PyCFunction) Custom_name, METH_NOARGS,
|
||||
"Return the name, combining the first and last name"
|
||||
},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
(note that we used the :const:`METH_NOARGS` flag to indicate that the method
|
||||
is expecting no arguments other than *self*)
|
||||
|
||||
and assign it to the :c:member:`~PyTypeObject.tp_methods` slot::
|
||||
|
||||
.tp_methods = Custom_methods,
|
||||
|
||||
Finally, we'll make our type usable as a base class for subclassing. We've
|
||||
written our methods carefully so far so that they don't make any assumptions
|
||||
about the type of the object being created or used, so all we need to do is
|
||||
to add the :const:`Py_TPFLAGS_BASETYPE` to our class flag definition::
|
||||
|
||||
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
||||
|
||||
We rename :c:func:`PyInit_custom` to :c:func:`PyInit_custom2`, update the
|
||||
module name in the :c:type:`PyModuleDef` struct, and update the full class
|
||||
name in the :c:type:`PyTypeObject` struct.
|
||||
|
||||
Finally, we update our :file:`setup.py` file to build the new module:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from distutils.core import setup, Extension
|
||||
setup(name="custom", version="1.0",
|
||||
ext_modules=[
|
||||
Extension("custom", ["custom.c"]),
|
||||
Extension("custom2", ["custom2.c"]),
|
||||
])
|
||||
|
||||
|
||||
Providing finer control over data attributes
|
||||
============================================
|
||||
|
||||
In this section, we'll provide finer control over how the :attr:`first` and
|
||||
:attr:`last` attributes are set in the :class:`Custom` example. In the previous
|
||||
version of our module, the instance variables :attr:`first` and :attr:`last`
|
||||
could be set to non-string values or even deleted. We want to make sure that
|
||||
these attributes always contain strings.
|
||||
|
||||
.. literalinclude:: ../includes/custom3.c
|
||||
|
||||
|
||||
To provide greater control, over the :attr:`first` and :attr:`last` attributes,
|
||||
we'll use custom getter and setter functions. Here are the functions for
|
||||
getting and setting the :attr:`first` attribute::
|
||||
|
||||
static PyObject *
|
||||
Custom_getfirst(CustomObject *self, void *closure)
|
||||
{
|
||||
Py_INCREF(self->first);
|
||||
return self->first;
|
||||
}
|
||||
|
||||
static int
|
||||
Custom_setfirst(CustomObject *self, PyObject *value, void *closure)
|
||||
{
|
||||
PyObject *tmp;
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute");
|
||||
return -1;
|
||||
}
|
||||
if (!PyUnicode_Check(value)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"The first attribute value must be a string");
|
||||
return -1;
|
||||
}
|
||||
tmp = self->first;
|
||||
Py_INCREF(value);
|
||||
self->first = value;
|
||||
Py_DECREF(tmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
The getter function is passed a :class:`Custom` object and a "closure", which is
|
||||
a void pointer. In this case, the closure is ignored. (The closure supports an
|
||||
advanced usage in which definition data is passed to the getter and setter. This
|
||||
could, for example, be used to allow a single set of getter and setter functions
|
||||
that decide the attribute to get or set based on data in the closure.)
|
||||
|
||||
The setter function is passed the :class:`Custom` object, the new value, and the
|
||||
closure. The new value may be *NULL*, in which case the attribute is being
|
||||
deleted. In our setter, we raise an error if the attribute is deleted or if its
|
||||
new value is not a string.
|
||||
|
||||
We create an array of :c:type:`PyGetSetDef` structures::
|
||||
|
||||
static PyGetSetDef Custom_getsetters[] = {
|
||||
{"first", (getter) Custom_getfirst, (setter) Custom_setfirst,
|
||||
"first name", NULL},
|
||||
{"last", (getter) Custom_getlast, (setter) Custom_setlast,
|
||||
"last name", NULL},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
and register it in the :c:member:`~PyTypeObject.tp_getset` slot::
|
||||
|
||||
.tp_getset = Custom_getsetters,
|
||||
|
||||
The last item in a :c:type:`PyGetSetDef` structure is the "closure" mentioned
|
||||
above. In this case, we aren't using a closure, so we just pass *NULL*.
|
||||
|
||||
We also remove the member definitions for these attributes::
|
||||
|
||||
static PyMemberDef Custom_members[] = {
|
||||
{"number", T_INT, offsetof(CustomObject, number), 0,
|
||||
"custom number"},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
We also need to update the :c:member:`~PyTypeObject.tp_init` handler to only
|
||||
allow strings [#]_ to be passed::
|
||||
|
||||
static int
|
||||
Custom_init(CustomObject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
static char *kwlist[] = {"first", "last", "number", NULL};
|
||||
PyObject *first = NULL, *last = NULL, *tmp;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|UUi", kwlist,
|
||||
&first, &last,
|
||||
&self->number))
|
||||
return -1;
|
||||
|
||||
if (first) {
|
||||
tmp = self->first;
|
||||
Py_INCREF(first);
|
||||
self->first = first;
|
||||
Py_DECREF(tmp);
|
||||
}
|
||||
if (last) {
|
||||
tmp = self->last;
|
||||
Py_INCREF(last);
|
||||
self->last = last;
|
||||
Py_DECREF(tmp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
With these changes, we can assure that the ``first`` and ``last`` members are
|
||||
never *NULL* so we can remove checks for *NULL* values in almost all cases.
|
||||
This means that most of the :c:func:`Py_XDECREF` calls can be converted to
|
||||
:c:func:`Py_DECREF` calls. The only place we can't change these calls is in
|
||||
the ``tp_dealloc`` implementation, where there is the possibility that the
|
||||
initialization of these members failed in ``tp_new``.
|
||||
|
||||
We also rename the module initialization function and module name in the
|
||||
initialization function, as we did before, and we add an extra definition to the
|
||||
:file:`setup.py` file.
|
||||
|
||||
|
||||
Supporting cyclic garbage collection
|
||||
====================================
|
||||
|
||||
Python has a :term:`cyclic garbage collector (GC) <garbage collection>` that
|
||||
can identify unneeded objects even when their reference counts are not zero.
|
||||
This can happen when objects are involved in cycles. For example, consider:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> l = []
|
||||
>>> l.append(l)
|
||||
>>> del l
|
||||
|
||||
In this example, we create a list that contains itself. When we delete it, it
|
||||
still has a reference from itself. Its reference count doesn't drop to zero.
|
||||
Fortunately, Python's cyclic garbage collector will eventually figure out that
|
||||
the list is garbage and free it.
|
||||
|
||||
In the second version of the :class:`Custom` example, we allowed any kind of
|
||||
object to be stored in the :attr:`first` or :attr:`last` attributes [#]_.
|
||||
Besides, in the second and third versions, we allowed subclassing
|
||||
:class:`Custom`, and subclasses may add arbitrary attributes. For any of
|
||||
those two reasons, :class:`Custom` objects can participate in cycles:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import custom3
|
||||
>>> class Derived(custom3.Custom): pass
|
||||
...
|
||||
>>> n = Derived()
|
||||
>>> n.some_attribute = n
|
||||
|
||||
To allow a :class:`Custom` instance participating in a reference cycle to
|
||||
be properly detected and collected by the cyclic GC, our :class:`Custom` type
|
||||
needs to fill two additional slots and to enable a flag that enables these slots:
|
||||
|
||||
.. literalinclude:: ../includes/custom4.c
|
||||
|
||||
|
||||
First, the traversal method lets the cyclic GC know about subobjects that could
|
||||
participate in cycles::
|
||||
|
||||
static int
|
||||
Custom_traverse(CustomObject *self, visitproc visit, void *arg)
|
||||
{
|
||||
int vret;
|
||||
if (self->first) {
|
||||
vret = visit(self->first, arg);
|
||||
if (vret != 0)
|
||||
return vret;
|
||||
}
|
||||
if (self->last) {
|
||||
vret = visit(self->last, arg);
|
||||
if (vret != 0)
|
||||
return vret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
For each subobject that can participate in cycles, we need to call the
|
||||
:c:func:`visit` function, which is passed to the traversal method. The
|
||||
:c:func:`visit` function takes as arguments the subobject and the extra argument
|
||||
*arg* passed to the traversal method. It returns an integer value that must be
|
||||
returned if it is non-zero.
|
||||
|
||||
Python provides a :c:func:`Py_VISIT` macro that automates calling visit
|
||||
functions. With :c:func:`Py_VISIT`, we can minimize the amount of boilerplate
|
||||
in ``Custom_traverse``::
|
||||
|
||||
static int
|
||||
Custom_traverse(CustomObject *self, visitproc visit, void *arg)
|
||||
{
|
||||
Py_VISIT(self->first);
|
||||
Py_VISIT(self->last);
|
||||
return 0;
|
||||
}
|
||||
|
||||
.. note::
|
||||
The :c:member:`~PyTypeObject.tp_traverse` implementation must name its
|
||||
arguments exactly *visit* and *arg* in order to use :c:func:`Py_VISIT`.
|
||||
|
||||
Second, we need to provide a method for clearing any subobjects that can
|
||||
participate in cycles::
|
||||
|
||||
static int
|
||||
Custom_clear(CustomObject *self)
|
||||
{
|
||||
Py_CLEAR(self->first);
|
||||
Py_CLEAR(self->last);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Notice the use of the :c:func:`Py_CLEAR` macro. It is the recommended and safe
|
||||
way to clear data attributes of arbitrary types while decrementing
|
||||
their reference counts. If you were to call :c:func:`Py_XDECREF` instead
|
||||
on the attribute before setting it to *NULL*, there is a possibility
|
||||
that the attribute's destructor would call back into code that reads the
|
||||
attribute again (*especially* if there is a reference cycle).
|
||||
|
||||
.. note::
|
||||
You could emulate :c:func:`Py_CLEAR` by writing::
|
||||
|
||||
PyObject *tmp;
|
||||
tmp = self->first;
|
||||
self->first = NULL;
|
||||
Py_XDECREF(tmp);
|
||||
|
||||
Nevertheless, it is much easier and less error-prone to always
|
||||
use :c:func:`Py_CLEAR` when deleting an attribute. Don't
|
||||
try to micro-optimize at the expense of robustness!
|
||||
|
||||
The deallocator ``Custom_dealloc`` may call arbitrary code when clearing
|
||||
attributes. It means the circular GC can be triggered inside the function.
|
||||
Since the GC assumes reference count is not zero, we need to untrack the object
|
||||
from the GC by calling :c:func:`PyObject_GC_UnTrack` before clearing members.
|
||||
Here is our reimplemented deallocator using :c:func:`PyObject_GC_UnTrack`
|
||||
and ``Custom_clear``::
|
||||
|
||||
static void
|
||||
Custom_dealloc(CustomObject *self)
|
||||
{
|
||||
PyObject_GC_UnTrack(self);
|
||||
Custom_clear(self);
|
||||
Py_TYPE(self)->tp_free((PyObject *) self);
|
||||
}
|
||||
|
||||
Finally, we add the :const:`Py_TPFLAGS_HAVE_GC` flag to the class flags::
|
||||
|
||||
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
|
||||
|
||||
That's pretty much it. If we had written custom :c:member:`~PyTypeObject.tp_alloc` or
|
||||
:c:member:`~PyTypeObject.tp_free` handlers, we'd need to modify them for cyclic
|
||||
garbage collection. Most extensions will use the versions automatically provided.
|
||||
|
||||
|
||||
Subclassing other types
|
||||
=======================
|
||||
|
||||
It is possible to create new extension types that are derived from existing
|
||||
types. It is easiest to inherit from the built in types, since an extension can
|
||||
easily use the :c:type:`PyTypeObject` it needs. It can be difficult to share
|
||||
these :c:type:`PyTypeObject` structures between extension modules.
|
||||
|
||||
In this example we will create a :class:`SubList` type that inherits from the
|
||||
built-in :class:`list` type. The new type will be completely compatible with
|
||||
regular lists, but will have an additional :meth:`increment` method that
|
||||
increases an internal counter:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import sublist
|
||||
>>> s = sublist.SubList(range(3))
|
||||
>>> s.extend(s)
|
||||
>>> print(len(s))
|
||||
6
|
||||
>>> print(s.increment())
|
||||
1
|
||||
>>> print(s.increment())
|
||||
2
|
||||
|
||||
.. literalinclude:: ../includes/sublist.c
|
||||
|
||||
|
||||
As you can see, the source code closely resembles the :class:`Custom` examples in
|
||||
previous sections. We will break down the main differences between them. ::
|
||||
|
||||
typedef struct {
|
||||
PyListObject list;
|
||||
int state;
|
||||
} SubListObject;
|
||||
|
||||
The primary difference for derived type objects is that the base type's
|
||||
object structure must be the first value. The base type will already include
|
||||
the :c:func:`PyObject_HEAD` at the beginning of its structure.
|
||||
|
||||
When a Python object is a :class:`SubList` instance, its ``PyObject *`` pointer
|
||||
can be safely cast to both ``PyListObject *`` and ``SubListObject *``::
|
||||
|
||||
static int
|
||||
SubList_init(SubListObject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
if (PyList_Type.tp_init((PyObject *) self, args, kwds) < 0)
|
||||
return -1;
|
||||
self->state = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
We see above how to call through to the :attr:`__init__` method of the base
|
||||
type.
|
||||
|
||||
This pattern is important when writing a type with custom
|
||||
:c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_dealloc`
|
||||
members. The :c:member:`~PyTypeObject.tp_new` handler should not actually
|
||||
create the memory for the object with its :c:member:`~PyTypeObject.tp_alloc`,
|
||||
but let the base class handle it by calling its own :c:member:`~PyTypeObject.tp_new`.
|
||||
|
||||
The :c:type:`PyTypeObject` struct supports a :c:member:`~PyTypeObject.tp_base`
|
||||
specifying the type's concrete base class. Due to cross-platform compiler
|
||||
issues, you can't fill that field directly with a reference to
|
||||
:c:type:`PyList_Type`; it should be done later in the module initialization
|
||||
function::
|
||||
|
||||
PyMODINIT_FUNC
|
||||
PyInit_sublist(void)
|
||||
{
|
||||
PyObject* m;
|
||||
SubListType.tp_base = &PyList_Type;
|
||||
if (PyType_Ready(&SubListType) < 0)
|
||||
return NULL;
|
||||
|
||||
m = PyModule_Create(&sublistmodule);
|
||||
if (m == NULL)
|
||||
return NULL;
|
||||
|
||||
Py_INCREF(&SubListType);
|
||||
PyModule_AddObject(m, "SubList", (PyObject *) &SubListType);
|
||||
return m;
|
||||
}
|
||||
|
||||
Before calling :c:func:`PyType_Ready`, the type structure must have the
|
||||
:c:member:`~PyTypeObject.tp_base` slot filled in. When we are deriving an
|
||||
existing type, it is not necessary to fill out the :c:member:`~PyTypeObject.tp_alloc`
|
||||
slot with :c:func:`PyType_GenericNew` -- the allocation function from the base
|
||||
type will be inherited.
|
||||
|
||||
After that, calling :c:func:`PyType_Ready` and adding the type object to the
|
||||
module is the same as with the basic :class:`Custom` examples.
|
||||
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [#] This is true when we know that the object is a basic type, like a string or a
|
||||
float.
|
||||
|
||||
.. [#] We relied on this in the :c:member:`~PyTypeObject.tp_dealloc` handler
|
||||
in this example, because our type doesn't support garbage collection.
|
||||
|
||||
.. [#] We now know that the first and last members are strings, so perhaps we
|
||||
could be less careful about decrementing their reference counts, however,
|
||||
we accept instances of string subclasses. Even though deallocating normal
|
||||
strings won't call back into our objects, we can't guarantee that deallocating
|
||||
an instance of a string subclass won't call back into our objects.
|
||||
|
||||
.. [#] Also, even with our attributes restricted to strings instances, the user
|
||||
could pass arbitrary :class:`str` subclasses and therefore still create
|
||||
reference cycles.
|
||||
137
python-3.7.4-docs-html/_sources/extending/windows.rst.txt
Normal file
137
python-3.7.4-docs-html/_sources/extending/windows.rst.txt
Normal file
@@ -0,0 +1,137 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
|
||||
.. _building-on-windows:
|
||||
|
||||
****************************************
|
||||
Building C and C++ Extensions on Windows
|
||||
****************************************
|
||||
|
||||
This chapter briefly explains how to create a Windows extension module for
|
||||
Python using Microsoft Visual C++, and follows with more detailed background
|
||||
information on how it works. The explanatory material is useful for both the
|
||||
Windows programmer learning to build Python extensions and the Unix programmer
|
||||
interested in producing software which can be successfully built on both Unix
|
||||
and Windows.
|
||||
|
||||
Module authors are encouraged to use the distutils approach for building
|
||||
extension modules, instead of the one described in this section. You will still
|
||||
need the C compiler that was used to build Python; typically Microsoft Visual
|
||||
C++.
|
||||
|
||||
.. note::
|
||||
|
||||
This chapter mentions a number of filenames that include an encoded Python
|
||||
version number. These filenames are represented with the version number shown
|
||||
as ``XY``; in practice, ``'X'`` will be the major version number and ``'Y'``
|
||||
will be the minor version number of the Python release you're working with. For
|
||||
example, if you are using Python 2.2.1, ``XY`` will actually be ``22``.
|
||||
|
||||
|
||||
.. _win-cookbook:
|
||||
|
||||
A Cookbook Approach
|
||||
===================
|
||||
|
||||
There are two approaches to building extension modules on Windows, just as there
|
||||
are on Unix: use the :mod:`distutils` package to control the build process, or
|
||||
do things manually. The distutils approach works well for most extensions;
|
||||
documentation on using :mod:`distutils` to build and package extension modules
|
||||
is available in :ref:`distutils-index`. If you find you really need to do
|
||||
things manually, it may be instructive to study the project file for the
|
||||
:source:`winsound <PCbuild/winsound.vcxproj>` standard library module.
|
||||
|
||||
|
||||
.. _dynamic-linking:
|
||||
|
||||
Differences Between Unix and Windows
|
||||
====================================
|
||||
|
||||
.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
|
||||
|
||||
|
||||
Unix and Windows use completely different paradigms for run-time loading of
|
||||
code. Before you try to build a module that can be dynamically loaded, be aware
|
||||
of how your system works.
|
||||
|
||||
In Unix, a shared object (:file:`.so`) file contains code to be used by the
|
||||
program, and also the names of functions and data that it expects to find in the
|
||||
program. When the file is joined to the program, all references to those
|
||||
functions and data in the file's code are changed to point to the actual
|
||||
locations in the program where the functions and data are placed in memory.
|
||||
This is basically a link operation.
|
||||
|
||||
In Windows, a dynamic-link library (:file:`.dll`) file has no dangling
|
||||
references. Instead, an access to functions or data goes through a lookup
|
||||
table. So the DLL code does not have to be fixed up at runtime to refer to the
|
||||
program's memory; instead, the code already uses the DLL's lookup table, and the
|
||||
lookup table is modified at runtime to point to the functions and data.
|
||||
|
||||
In Unix, there is only one type of library file (:file:`.a`) which contains code
|
||||
from several object files (:file:`.o`). During the link step to create a shared
|
||||
object file (:file:`.so`), the linker may find that it doesn't know where an
|
||||
identifier is defined. The linker will look for it in the object files in the
|
||||
libraries; if it finds it, it will include all the code from that object file.
|
||||
|
||||
In Windows, there are two types of library, a static library and an import
|
||||
library (both called :file:`.lib`). A static library is like a Unix :file:`.a`
|
||||
file; it contains code to be included as necessary. An import library is
|
||||
basically used only to reassure the linker that a certain identifier is legal,
|
||||
and will be present in the program when the DLL is loaded. So the linker uses
|
||||
the information from the import library to build the lookup table for using
|
||||
identifiers that are not included in the DLL. When an application or a DLL is
|
||||
linked, an import library may be generated, which will need to be used for all
|
||||
future DLLs that depend on the symbols in the application or DLL.
|
||||
|
||||
Suppose you are building two dynamic-load modules, B and C, which should share
|
||||
another block of code A. On Unix, you would *not* pass :file:`A.a` to the
|
||||
linker for :file:`B.so` and :file:`C.so`; that would cause it to be included
|
||||
twice, so that B and C would each have their own copy. In Windows, building
|
||||
:file:`A.dll` will also build :file:`A.lib`. You *do* pass :file:`A.lib` to the
|
||||
linker for B and C. :file:`A.lib` does not contain code; it just contains
|
||||
information which will be used at runtime to access A's code.
|
||||
|
||||
In Windows, using an import library is sort of like using ``import spam``; it
|
||||
gives you access to spam's names, but does not create a separate copy. On Unix,
|
||||
linking with a library is more like ``from spam import *``; it does create a
|
||||
separate copy.
|
||||
|
||||
|
||||
.. _win-dlls:
|
||||
|
||||
Using DLLs in Practice
|
||||
======================
|
||||
|
||||
.. sectionauthor:: Chris Phoenix <cphoenix@best.com>
|
||||
|
||||
|
||||
Windows Python is built in Microsoft Visual C++; using other compilers may or
|
||||
may not work (though Borland seems to). The rest of this section is MSVC++
|
||||
specific.
|
||||
|
||||
When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker.
|
||||
To build two DLLs, spam and ni (which uses C functions found in spam), you could
|
||||
use these commands::
|
||||
|
||||
cl /LD /I/python/include spam.c ../libs/pythonXY.lib
|
||||
cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib
|
||||
|
||||
The first command created three files: :file:`spam.obj`, :file:`spam.dll` and
|
||||
:file:`spam.lib`. :file:`Spam.dll` does not contain any Python functions (such
|
||||
as :c:func:`PyArg_ParseTuple`), but it does know how to find the Python code
|
||||
thanks to :file:`pythonXY.lib`.
|
||||
|
||||
The second command created :file:`ni.dll` (and :file:`.obj` and :file:`.lib`),
|
||||
which knows how to find the necessary functions from spam, and also from the
|
||||
Python executable.
|
||||
|
||||
Not every identifier is exported to the lookup table. If you want any other
|
||||
modules (including Python) to be able to see your identifiers, you have to say
|
||||
``_declspec(dllexport)``, as in ``void _declspec(dllexport) initspam(void)`` or
|
||||
``PyObject _declspec(dllexport) *NiGetSpamData(void)``.
|
||||
|
||||
Developer Studio will throw in a lot of import libraries that you do not really
|
||||
need, adding about 100K to your executable. To get rid of them, use the Project
|
||||
Settings dialog, Link tab, to specify *ignore default libraries*. Add the
|
||||
correct :file:`msvcrtxx.lib` to the list of libraries.
|
||||
|
||||
808
python-3.7.4-docs-html/_sources/faq/design.rst.txt
Normal file
808
python-3.7.4-docs-html/_sources/faq/design.rst.txt
Normal file
@@ -0,0 +1,808 @@
|
||||
======================
|
||||
Design and History FAQ
|
||||
======================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
Why does Python use indentation for grouping of statements?
|
||||
-----------------------------------------------------------
|
||||
|
||||
Guido van Rossum believes that using indentation for grouping is extremely
|
||||
elegant and contributes a lot to the clarity of the average Python program.
|
||||
Most people learn to love this feature after a while.
|
||||
|
||||
Since there are no begin/end brackets there cannot be a disagreement between
|
||||
grouping perceived by the parser and the human reader. Occasionally C
|
||||
programmers will encounter a fragment of code like this::
|
||||
|
||||
if (x <= y)
|
||||
x++;
|
||||
y--;
|
||||
z++;
|
||||
|
||||
Only the ``x++`` statement is executed if the condition is true, but the
|
||||
indentation leads you to believe otherwise. Even experienced C programmers will
|
||||
sometimes stare at it a long time wondering why ``y`` is being decremented even
|
||||
for ``x > y``.
|
||||
|
||||
Because there are no begin/end brackets, Python is much less prone to
|
||||
coding-style conflicts. In C there are many different ways to place the braces.
|
||||
If you're used to reading and writing code that uses one style, you will feel at
|
||||
least slightly uneasy when reading (or being required to write) another style.
|
||||
|
||||
Many coding styles place begin/end brackets on a line by themselves. This makes
|
||||
programs considerably longer and wastes valuable screen space, making it harder
|
||||
to get a good overview of a program. Ideally, a function should fit on one
|
||||
screen (say, 20--30 lines). 20 lines of Python can do a lot more work than 20
|
||||
lines of C. This is not solely due to the lack of begin/end brackets -- the
|
||||
lack of declarations and the high-level data types are also responsible -- but
|
||||
the indentation-based syntax certainly helps.
|
||||
|
||||
|
||||
Why am I getting strange results with simple arithmetic operations?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
See the next question.
|
||||
|
||||
|
||||
Why are floating-point calculations so inaccurate?
|
||||
--------------------------------------------------
|
||||
|
||||
Users are often surprised by results like this::
|
||||
|
||||
>>> 1.2 - 1.0
|
||||
0.19999999999999996
|
||||
|
||||
and think it is a bug in Python. It's not. This has little to do with Python,
|
||||
and much more to do with how the underlying platform handles floating-point
|
||||
numbers.
|
||||
|
||||
The :class:`float` type in CPython uses a C ``double`` for storage. A
|
||||
:class:`float` object's value is stored in binary floating-point with a fixed
|
||||
precision (typically 53 bits) and Python uses C operations, which in turn rely
|
||||
on the hardware implementation in the processor, to perform floating-point
|
||||
operations. This means that as far as floating-point operations are concerned,
|
||||
Python behaves like many popular languages including C and Java.
|
||||
|
||||
Many numbers that can be written easily in decimal notation cannot be expressed
|
||||
exactly in binary floating-point. For example, after::
|
||||
|
||||
>>> x = 1.2
|
||||
|
||||
the value stored for ``x`` is a (very good) approximation to the decimal value
|
||||
``1.2``, but is not exactly equal to it. On a typical machine, the actual
|
||||
stored value is::
|
||||
|
||||
1.0011001100110011001100110011001100110011001100110011 (binary)
|
||||
|
||||
which is exactly::
|
||||
|
||||
1.1999999999999999555910790149937383830547332763671875 (decimal)
|
||||
|
||||
The typical precision of 53 bits provides Python floats with 15--16
|
||||
decimal digits of accuracy.
|
||||
|
||||
For a fuller explanation, please see the :ref:`floating point arithmetic
|
||||
<tut-fp-issues>` chapter in the Python tutorial.
|
||||
|
||||
|
||||
Why are Python strings immutable?
|
||||
---------------------------------
|
||||
|
||||
There are several advantages.
|
||||
|
||||
One is performance: knowing that a string is immutable means we can allocate
|
||||
space for it at creation time, and the storage requirements are fixed and
|
||||
unchanging. This is also one of the reasons for the distinction between tuples
|
||||
and lists.
|
||||
|
||||
Another advantage is that strings in Python are considered as "elemental" as
|
||||
numbers. No amount of activity will change the value 8 to anything else, and in
|
||||
Python, no amount of activity will change the string "eight" to anything else.
|
||||
|
||||
|
||||
.. _why-self:
|
||||
|
||||
Why must 'self' be used explicitly in method definitions and calls?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
The idea was borrowed from Modula-3. It turns out to be very useful, for a
|
||||
variety of reasons.
|
||||
|
||||
First, it's more obvious that you are using a method or instance attribute
|
||||
instead of a local variable. Reading ``self.x`` or ``self.meth()`` makes it
|
||||
absolutely clear that an instance variable or method is used even if you don't
|
||||
know the class definition by heart. In C++, you can sort of tell by the lack of
|
||||
a local variable declaration (assuming globals are rare or easily recognizable)
|
||||
-- but in Python, there are no local variable declarations, so you'd have to
|
||||
look up the class definition to be sure. Some C++ and Java coding standards
|
||||
call for instance attributes to have an ``m_`` prefix, so this explicitness is
|
||||
still useful in those languages, too.
|
||||
|
||||
Second, it means that no special syntax is necessary if you want to explicitly
|
||||
reference or call the method from a particular class. In C++, if you want to
|
||||
use a method from a base class which is overridden in a derived class, you have
|
||||
to use the ``::`` operator -- in Python you can write
|
||||
``baseclass.methodname(self, <argument list>)``. This is particularly useful
|
||||
for :meth:`__init__` methods, and in general in cases where a derived class
|
||||
method wants to extend the base class method of the same name and thus has to
|
||||
call the base class method somehow.
|
||||
|
||||
Finally, for instance variables it solves a syntactic problem with assignment:
|
||||
since local variables in Python are (by definition!) those variables to which a
|
||||
value is assigned in a function body (and that aren't explicitly declared
|
||||
global), there has to be some way to tell the interpreter that an assignment was
|
||||
meant to assign to an instance variable instead of to a local variable, and it
|
||||
should preferably be syntactic (for efficiency reasons). C++ does this through
|
||||
declarations, but Python doesn't have declarations and it would be a pity having
|
||||
to introduce them just for this purpose. Using the explicit ``self.var`` solves
|
||||
this nicely. Similarly, for using instance variables, having to write
|
||||
``self.var`` means that references to unqualified names inside a method don't
|
||||
have to search the instance's directories. To put it another way, local
|
||||
variables and instance variables live in two different namespaces, and you need
|
||||
to tell Python which namespace to use.
|
||||
|
||||
|
||||
Why can't I use an assignment in an expression?
|
||||
-----------------------------------------------
|
||||
|
||||
Many people used to C or Perl complain that they want to use this C idiom:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
while (line = readline(f)) {
|
||||
// do something with line
|
||||
}
|
||||
|
||||
where in Python you're forced to write this::
|
||||
|
||||
while True:
|
||||
line = f.readline()
|
||||
if not line:
|
||||
break
|
||||
... # do something with line
|
||||
|
||||
The reason for not allowing assignment in Python expressions is a common,
|
||||
hard-to-find bug in those other languages, caused by this construct:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
if (x = 0) {
|
||||
// error handling
|
||||
}
|
||||
else {
|
||||
// code that only works for nonzero x
|
||||
}
|
||||
|
||||
The error is a simple typo: ``x = 0``, which assigns 0 to the variable ``x``,
|
||||
was written while the comparison ``x == 0`` is certainly what was intended.
|
||||
|
||||
Many alternatives have been proposed. Most are hacks that save some typing but
|
||||
use arbitrary or cryptic syntax or keywords, and fail the simple criterion for
|
||||
language change proposals: it should intuitively suggest the proper meaning to a
|
||||
human reader who has not yet been introduced to the construct.
|
||||
|
||||
An interesting phenomenon is that most experienced Python programmers recognize
|
||||
the ``while True`` idiom and don't seem to be missing the assignment in
|
||||
expression construct much; it's only newcomers who express a strong desire to
|
||||
add this to the language.
|
||||
|
||||
There's an alternative way of spelling this that seems attractive but is
|
||||
generally less robust than the "while True" solution::
|
||||
|
||||
line = f.readline()
|
||||
while line:
|
||||
... # do something with line...
|
||||
line = f.readline()
|
||||
|
||||
The problem with this is that if you change your mind about exactly how you get
|
||||
the next line (e.g. you want to change it into ``sys.stdin.readline()``) you
|
||||
have to remember to change two places in your program -- the second occurrence
|
||||
is hidden at the bottom of the loop.
|
||||
|
||||
The best approach is to use iterators, making it possible to loop through
|
||||
objects using the ``for`` statement. For example, :term:`file objects
|
||||
<file object>` support the iterator protocol, so you can write simply::
|
||||
|
||||
for line in f:
|
||||
... # do something with line...
|
||||
|
||||
|
||||
|
||||
Why does Python use methods for some functionality (e.g. list.index()) but functions for other (e.g. len(list))?
|
||||
----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
As Guido said:
|
||||
|
||||
(a) For some operations, prefix notation just reads better than
|
||||
postfix -- prefix (and infix!) operations have a long tradition in
|
||||
mathematics which likes notations where the visuals help the
|
||||
mathematician thinking about a problem. Compare the easy with which we
|
||||
rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of
|
||||
doing the same thing using a raw OO notation.
|
||||
|
||||
(b) When I read code that says len(x) I *know* that it is asking for
|
||||
the length of something. This tells me two things: the result is an
|
||||
integer, and the argument is some kind of container. To the contrary,
|
||||
when I read x.len(), I have to already know that x is some kind of
|
||||
container implementing an interface or inheriting from a class that
|
||||
has a standard len(). Witness the confusion we occasionally have when
|
||||
a class that is not implementing a mapping has a get() or keys()
|
||||
method, or something that isn't a file has a write() method.
|
||||
|
||||
-- https://mail.python.org/pipermail/python-3000/2006-November/004643.html
|
||||
|
||||
|
||||
Why is join() a string method instead of a list or tuple method?
|
||||
----------------------------------------------------------------
|
||||
|
||||
Strings became much more like other standard types starting in Python 1.6, when
|
||||
methods were added which give the same functionality that has always been
|
||||
available using the functions of the string module. Most of these new methods
|
||||
have been widely accepted, but the one which appears to make some programmers
|
||||
feel uncomfortable is::
|
||||
|
||||
", ".join(['1', '2', '4', '8', '16'])
|
||||
|
||||
which gives the result::
|
||||
|
||||
"1, 2, 4, 8, 16"
|
||||
|
||||
There are two common arguments against this usage.
|
||||
|
||||
The first runs along the lines of: "It looks really ugly using a method of a
|
||||
string literal (string constant)", to which the answer is that it might, but a
|
||||
string literal is just a fixed value. If the methods are to be allowed on names
|
||||
bound to strings there is no logical reason to make them unavailable on
|
||||
literals.
|
||||
|
||||
The second objection is typically cast as: "I am really telling a sequence to
|
||||
join its members together with a string constant". Sadly, you aren't. For some
|
||||
reason there seems to be much less difficulty with having :meth:`~str.split` as
|
||||
a string method, since in that case it is easy to see that ::
|
||||
|
||||
"1, 2, 4, 8, 16".split(", ")
|
||||
|
||||
is an instruction to a string literal to return the substrings delimited by the
|
||||
given separator (or, by default, arbitrary runs of white space).
|
||||
|
||||
:meth:`~str.join` is a string method because in using it you are telling the
|
||||
separator string to iterate over a sequence of strings and insert itself between
|
||||
adjacent elements. This method can be used with any argument which obeys the
|
||||
rules for sequence objects, including any new classes you might define yourself.
|
||||
Similar methods exist for bytes and bytearray objects.
|
||||
|
||||
|
||||
How fast are exceptions?
|
||||
------------------------
|
||||
|
||||
A try/except block is extremely efficient if no exceptions are raised. Actually
|
||||
catching an exception is expensive. In versions of Python prior to 2.0 it was
|
||||
common to use this idiom::
|
||||
|
||||
try:
|
||||
value = mydict[key]
|
||||
except KeyError:
|
||||
mydict[key] = getvalue(key)
|
||||
value = mydict[key]
|
||||
|
||||
This only made sense when you expected the dict to have the key almost all the
|
||||
time. If that wasn't the case, you coded it like this::
|
||||
|
||||
if key in mydict:
|
||||
value = mydict[key]
|
||||
else:
|
||||
value = mydict[key] = getvalue(key)
|
||||
|
||||
For this specific case, you could also use ``value = dict.setdefault(key,
|
||||
getvalue(key))``, but only if the ``getvalue()`` call is cheap enough because it
|
||||
is evaluated in all cases.
|
||||
|
||||
|
||||
Why isn't there a switch or case statement in Python?
|
||||
-----------------------------------------------------
|
||||
|
||||
You can do this easily enough with a sequence of ``if... elif... elif... else``.
|
||||
There have been some proposals for switch statement syntax, but there is no
|
||||
consensus (yet) on whether and how to do range tests. See :pep:`275` for
|
||||
complete details and the current status.
|
||||
|
||||
For cases where you need to choose from a very large number of possibilities,
|
||||
you can create a dictionary mapping case values to functions to call. For
|
||||
example::
|
||||
|
||||
def function_1(...):
|
||||
...
|
||||
|
||||
functions = {'a': function_1,
|
||||
'b': function_2,
|
||||
'c': self.method_1, ...}
|
||||
|
||||
func = functions[value]
|
||||
func()
|
||||
|
||||
For calling methods on objects, you can simplify yet further by using the
|
||||
:func:`getattr` built-in to retrieve methods with a particular name::
|
||||
|
||||
def visit_a(self, ...):
|
||||
...
|
||||
...
|
||||
|
||||
def dispatch(self, value):
|
||||
method_name = 'visit_' + str(value)
|
||||
method = getattr(self, method_name)
|
||||
method()
|
||||
|
||||
It's suggested that you use a prefix for the method names, such as ``visit_`` in
|
||||
this example. Without such a prefix, if values are coming from an untrusted
|
||||
source, an attacker would be able to call any method on your object.
|
||||
|
||||
|
||||
Can't you emulate threads in the interpreter instead of relying on an OS-specific thread implementation?
|
||||
--------------------------------------------------------------------------------------------------------
|
||||
|
||||
Answer 1: Unfortunately, the interpreter pushes at least one C stack frame for
|
||||
each Python stack frame. Also, extensions can call back into Python at almost
|
||||
random moments. Therefore, a complete threads implementation requires thread
|
||||
support for C.
|
||||
|
||||
Answer 2: Fortunately, there is `Stackless Python <https://github.com/stackless-dev/stackless/wiki>`_,
|
||||
which has a completely redesigned interpreter loop that avoids the C stack.
|
||||
|
||||
|
||||
Why can't lambda expressions contain statements?
|
||||
------------------------------------------------
|
||||
|
||||
Python lambda expressions cannot contain statements because Python's syntactic
|
||||
framework can't handle statements nested inside expressions. However, in
|
||||
Python, this is not a serious problem. Unlike lambda forms in other languages,
|
||||
where they add functionality, Python lambdas are only a shorthand notation if
|
||||
you're too lazy to define a function.
|
||||
|
||||
Functions are already first class objects in Python, and can be declared in a
|
||||
local scope. Therefore the only advantage of using a lambda instead of a
|
||||
locally-defined function is that you don't need to invent a name for the
|
||||
function -- but that's just a local variable to which the function object (which
|
||||
is exactly the same type of object that a lambda expression yields) is assigned!
|
||||
|
||||
|
||||
Can Python be compiled to machine code, C or some other language?
|
||||
-----------------------------------------------------------------
|
||||
|
||||
`Cython <http://cython.org/>`_ compiles a modified version of Python with
|
||||
optional annotations into C extensions. `Nuitka <http://www.nuitka.net/>`_ is
|
||||
an up-and-coming compiler of Python into C++ code, aiming to support the full
|
||||
Python language. For compiling to Java you can consider
|
||||
`VOC <https://voc.readthedocs.io>`_.
|
||||
|
||||
|
||||
How does Python manage memory?
|
||||
------------------------------
|
||||
|
||||
The details of Python memory management depend on the implementation. The
|
||||
standard implementation of Python, :term:`CPython`, uses reference counting to
|
||||
detect inaccessible objects, and another mechanism to collect reference cycles,
|
||||
periodically executing a cycle detection algorithm which looks for inaccessible
|
||||
cycles and deletes the objects involved. The :mod:`gc` module provides functions
|
||||
to perform a garbage collection, obtain debugging statistics, and tune the
|
||||
collector's parameters.
|
||||
|
||||
Other implementations (such as `Jython <http://www.jython.org>`_ or
|
||||
`PyPy <http://www.pypy.org>`_), however, can rely on a different mechanism
|
||||
such as a full-blown garbage collector. This difference can cause some
|
||||
subtle porting problems if your Python code depends on the behavior of the
|
||||
reference counting implementation.
|
||||
|
||||
In some Python implementations, the following code (which is fine in CPython)
|
||||
will probably run out of file descriptors::
|
||||
|
||||
for file in very_long_list_of_files:
|
||||
f = open(file)
|
||||
c = f.read(1)
|
||||
|
||||
Indeed, using CPython's reference counting and destructor scheme, each new
|
||||
assignment to *f* closes the previous file. With a traditional GC, however,
|
||||
those file objects will only get collected (and closed) at varying and possibly
|
||||
long intervals.
|
||||
|
||||
If you want to write code that will work with any Python implementation,
|
||||
you should explicitly close the file or use the :keyword:`with` statement;
|
||||
this will work regardless of memory management scheme::
|
||||
|
||||
for file in very_long_list_of_files:
|
||||
with open(file) as f:
|
||||
c = f.read(1)
|
||||
|
||||
|
||||
Why doesn't CPython use a more traditional garbage collection scheme?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
For one thing, this is not a C standard feature and hence it's not portable.
|
||||
(Yes, we know about the Boehm GC library. It has bits of assembler code for
|
||||
*most* common platforms, not for all of them, and although it is mostly
|
||||
transparent, it isn't completely transparent; patches are required to get
|
||||
Python to work with it.)
|
||||
|
||||
Traditional GC also becomes a problem when Python is embedded into other
|
||||
applications. While in a standalone Python it's fine to replace the standard
|
||||
malloc() and free() with versions provided by the GC library, an application
|
||||
embedding Python may want to have its *own* substitute for malloc() and free(),
|
||||
and may not want Python's. Right now, CPython works with anything that
|
||||
implements malloc() and free() properly.
|
||||
|
||||
|
||||
Why isn't all memory freed when CPython exits?
|
||||
----------------------------------------------
|
||||
|
||||
Objects referenced from the global namespaces of Python modules are not always
|
||||
deallocated when Python exits. This may happen if there are circular
|
||||
references. There are also certain bits of memory that are allocated by the C
|
||||
library that are impossible to free (e.g. a tool like Purify will complain about
|
||||
these). Python is, however, aggressive about cleaning up memory on exit and
|
||||
does try to destroy every single object.
|
||||
|
||||
If you want to force Python to delete certain things on deallocation use the
|
||||
:mod:`atexit` module to run a function that will force those deletions.
|
||||
|
||||
|
||||
Why are there separate tuple and list data types?
|
||||
-------------------------------------------------
|
||||
|
||||
Lists and tuples, while similar in many respects, are generally used in
|
||||
fundamentally different ways. Tuples can be thought of as being similar to
|
||||
Pascal records or C structs; they're small collections of related data which may
|
||||
be of different types which are operated on as a group. For example, a
|
||||
Cartesian coordinate is appropriately represented as a tuple of two or three
|
||||
numbers.
|
||||
|
||||
Lists, on the other hand, are more like arrays in other languages. They tend to
|
||||
hold a varying number of objects all of which have the same type and which are
|
||||
operated on one-by-one. For example, ``os.listdir('.')`` returns a list of
|
||||
strings representing the files in the current directory. Functions which
|
||||
operate on this output would generally not break if you added another file or
|
||||
two to the directory.
|
||||
|
||||
Tuples are immutable, meaning that once a tuple has been created, you can't
|
||||
replace any of its elements with a new value. Lists are mutable, meaning that
|
||||
you can always change a list's elements. Only immutable elements can be used as
|
||||
dictionary keys, and hence only tuples and not lists can be used as keys.
|
||||
|
||||
|
||||
How are lists implemented in CPython?
|
||||
-------------------------------------
|
||||
|
||||
CPython's lists are really variable-length arrays, not Lisp-style linked lists.
|
||||
The implementation uses a contiguous array of references to other objects, and
|
||||
keeps a pointer to this array and the array's length in a list head structure.
|
||||
|
||||
This makes indexing a list ``a[i]`` an operation whose cost is independent of
|
||||
the size of the list or the value of the index.
|
||||
|
||||
When items are appended or inserted, the array of references is resized. Some
|
||||
cleverness is applied to improve the performance of appending items repeatedly;
|
||||
when the array must be grown, some extra space is allocated so the next few
|
||||
times don't require an actual resize.
|
||||
|
||||
|
||||
How are dictionaries implemented in CPython?
|
||||
--------------------------------------------
|
||||
|
||||
CPython's dictionaries are implemented as resizable hash tables. Compared to
|
||||
B-trees, this gives better performance for lookup (the most common operation by
|
||||
far) under most circumstances, and the implementation is simpler.
|
||||
|
||||
Dictionaries work by computing a hash code for each key stored in the dictionary
|
||||
using the :func:`hash` built-in function. The hash code varies widely depending
|
||||
on the key and a per-process seed; for example, "Python" could hash to
|
||||
-539294296 while "python", a string that differs by a single bit, could hash
|
||||
to 1142331976. The hash code is then used to calculate a location in an
|
||||
internal array where the value will be stored. Assuming that you're storing
|
||||
keys that all have different hash values, this means that dictionaries take
|
||||
constant time -- O(1), in Big-O notation -- to retrieve a key.
|
||||
|
||||
|
||||
Why must dictionary keys be immutable?
|
||||
--------------------------------------
|
||||
|
||||
The hash table implementation of dictionaries uses a hash value calculated from
|
||||
the key value to find the key. If the key were a mutable object, its value
|
||||
could change, and thus its hash could also change. But since whoever changes
|
||||
the key object can't tell that it was being used as a dictionary key, it can't
|
||||
move the entry around in the dictionary. Then, when you try to look up the same
|
||||
object in the dictionary it won't be found because its hash value is different.
|
||||
If you tried to look up the old value it wouldn't be found either, because the
|
||||
value of the object found in that hash bin would be different.
|
||||
|
||||
If you want a dictionary indexed with a list, simply convert the list to a tuple
|
||||
first; the function ``tuple(L)`` creates a tuple with the same entries as the
|
||||
list ``L``. Tuples are immutable and can therefore be used as dictionary keys.
|
||||
|
||||
Some unacceptable solutions that have been proposed:
|
||||
|
||||
- Hash lists by their address (object ID). This doesn't work because if you
|
||||
construct a new list with the same value it won't be found; e.g.::
|
||||
|
||||
mydict = {[1, 2]: '12'}
|
||||
print(mydict[[1, 2]])
|
||||
|
||||
would raise a :exc:`KeyError` exception because the id of the ``[1, 2]`` used in the
|
||||
second line differs from that in the first line. In other words, dictionary
|
||||
keys should be compared using ``==``, not using :keyword:`is`.
|
||||
|
||||
- Make a copy when using a list as a key. This doesn't work because the list,
|
||||
being a mutable object, could contain a reference to itself, and then the
|
||||
copying code would run into an infinite loop.
|
||||
|
||||
- Allow lists as keys but tell the user not to modify them. This would allow a
|
||||
class of hard-to-track bugs in programs when you forgot or modified a list by
|
||||
accident. It also invalidates an important invariant of dictionaries: every
|
||||
value in ``d.keys()`` is usable as a key of the dictionary.
|
||||
|
||||
- Mark lists as read-only once they are used as a dictionary key. The problem
|
||||
is that it's not just the top-level object that could change its value; you
|
||||
could use a tuple containing a list as a key. Entering anything as a key into
|
||||
a dictionary would require marking all objects reachable from there as
|
||||
read-only -- and again, self-referential objects could cause an infinite loop.
|
||||
|
||||
There is a trick to get around this if you need to, but use it at your own risk:
|
||||
You can wrap a mutable structure inside a class instance which has both a
|
||||
:meth:`__eq__` and a :meth:`__hash__` method. You must then make sure that the
|
||||
hash value for all such wrapper objects that reside in a dictionary (or other
|
||||
hash based structure), remain fixed while the object is in the dictionary (or
|
||||
other structure). ::
|
||||
|
||||
class ListWrapper:
|
||||
def __init__(self, the_list):
|
||||
self.the_list = the_list
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.the_list == other.the_list
|
||||
|
||||
def __hash__(self):
|
||||
l = self.the_list
|
||||
result = 98767 - len(l)*555
|
||||
for i, el in enumerate(l):
|
||||
try:
|
||||
result = result + (hash(el) % 9999999) * 1001 + i
|
||||
except Exception:
|
||||
result = (result % 7777777) + i * 333
|
||||
return result
|
||||
|
||||
Note that the hash computation is complicated by the possibility that some
|
||||
members of the list may be unhashable and also by the possibility of arithmetic
|
||||
overflow.
|
||||
|
||||
Furthermore it must always be the case that if ``o1 == o2`` (ie ``o1.__eq__(o2)
|
||||
is True``) then ``hash(o1) == hash(o2)`` (ie, ``o1.__hash__() == o2.__hash__()``),
|
||||
regardless of whether the object is in a dictionary or not. If you fail to meet
|
||||
these restrictions dictionaries and other hash based structures will misbehave.
|
||||
|
||||
In the case of ListWrapper, whenever the wrapper object is in a dictionary the
|
||||
wrapped list must not change to avoid anomalies. Don't do this unless you are
|
||||
prepared to think hard about the requirements and the consequences of not
|
||||
meeting them correctly. Consider yourself warned.
|
||||
|
||||
|
||||
Why doesn't list.sort() return the sorted list?
|
||||
-----------------------------------------------
|
||||
|
||||
In situations where performance matters, making a copy of the list just to sort
|
||||
it would be wasteful. Therefore, :meth:`list.sort` sorts the list in place. In
|
||||
order to remind you of that fact, it does not return the sorted list. This way,
|
||||
you won't be fooled into accidentally overwriting a list when you need a sorted
|
||||
copy but also need to keep the unsorted version around.
|
||||
|
||||
If you want to return a new list, use the built-in :func:`sorted` function
|
||||
instead. This function creates a new list from a provided iterable, sorts
|
||||
it and returns it. For example, here's how to iterate over the keys of a
|
||||
dictionary in sorted order::
|
||||
|
||||
for key in sorted(mydict):
|
||||
... # do whatever with mydict[key]...
|
||||
|
||||
|
||||
How do you specify and enforce an interface spec in Python?
|
||||
-----------------------------------------------------------
|
||||
|
||||
An interface specification for a module as provided by languages such as C++ and
|
||||
Java describes the prototypes for the methods and functions of the module. Many
|
||||
feel that compile-time enforcement of interface specifications helps in the
|
||||
construction of large programs.
|
||||
|
||||
Python 2.6 adds an :mod:`abc` module that lets you define Abstract Base Classes
|
||||
(ABCs). You can then use :func:`isinstance` and :func:`issubclass` to check
|
||||
whether an instance or a class implements a particular ABC. The
|
||||
:mod:`collections.abc` module defines a set of useful ABCs such as
|
||||
:class:`~collections.abc.Iterable`, :class:`~collections.abc.Container`, and
|
||||
:class:`~collections.abc.MutableMapping`.
|
||||
|
||||
For Python, many of the advantages of interface specifications can be obtained
|
||||
by an appropriate test discipline for components. There is also a tool,
|
||||
PyChecker, which can be used to find problems due to subclassing.
|
||||
|
||||
A good test suite for a module can both provide a regression test and serve as a
|
||||
module interface specification and a set of examples. Many Python modules can
|
||||
be run as a script to provide a simple "self test." Even modules which use
|
||||
complex external interfaces can often be tested in isolation using trivial
|
||||
"stub" emulations of the external interface. The :mod:`doctest` and
|
||||
:mod:`unittest` modules or third-party test frameworks can be used to construct
|
||||
exhaustive test suites that exercise every line of code in a module.
|
||||
|
||||
An appropriate testing discipline can help build large complex applications in
|
||||
Python as well as having interface specifications would. In fact, it can be
|
||||
better because an interface specification cannot test certain properties of a
|
||||
program. For example, the :meth:`append` method is expected to add new elements
|
||||
to the end of some internal list; an interface specification cannot test that
|
||||
your :meth:`append` implementation will actually do this correctly, but it's
|
||||
trivial to check this property in a test suite.
|
||||
|
||||
Writing test suites is very helpful, and you might want to design your code with
|
||||
an eye to making it easily tested. One increasingly popular technique,
|
||||
test-directed development, calls for writing parts of the test suite first,
|
||||
before you write any of the actual code. Of course Python allows you to be
|
||||
sloppy and not write test cases at all.
|
||||
|
||||
|
||||
Why is there no goto?
|
||||
---------------------
|
||||
|
||||
You can use exceptions to provide a "structured goto" that even works across
|
||||
function calls. Many feel that exceptions can conveniently emulate all
|
||||
reasonable uses of the "go" or "goto" constructs of C, Fortran, and other
|
||||
languages. For example::
|
||||
|
||||
class label(Exception): pass # declare a label
|
||||
|
||||
try:
|
||||
...
|
||||
if condition: raise label() # goto label
|
||||
...
|
||||
except label: # where to goto
|
||||
pass
|
||||
...
|
||||
|
||||
This doesn't allow you to jump into the middle of a loop, but that's usually
|
||||
considered an abuse of goto anyway. Use sparingly.
|
||||
|
||||
|
||||
Why can't raw strings (r-strings) end with a backslash?
|
||||
-------------------------------------------------------
|
||||
|
||||
More precisely, they can't end with an odd number of backslashes: the unpaired
|
||||
backslash at the end escapes the closing quote character, leaving an
|
||||
unterminated string.
|
||||
|
||||
Raw strings were designed to ease creating input for processors (chiefly regular
|
||||
expression engines) that want to do their own backslash escape processing. Such
|
||||
processors consider an unmatched trailing backslash to be an error anyway, so
|
||||
raw strings disallow that. In return, they allow you to pass on the string
|
||||
quote character by escaping it with a backslash. These rules work well when
|
||||
r-strings are used for their intended purpose.
|
||||
|
||||
If you're trying to build Windows pathnames, note that all Windows system calls
|
||||
accept forward slashes too::
|
||||
|
||||
f = open("/mydir/file.txt") # works fine!
|
||||
|
||||
If you're trying to build a pathname for a DOS command, try e.g. one of ::
|
||||
|
||||
dir = r"\this\is\my\dos\dir" "\\"
|
||||
dir = r"\this\is\my\dos\dir\ "[:-1]
|
||||
dir = "\\this\\is\\my\\dos\\dir\\"
|
||||
|
||||
|
||||
Why doesn't Python have a "with" statement for attribute assignments?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Python has a 'with' statement that wraps the execution of a block, calling code
|
||||
on the entrance and exit from the block. Some language have a construct that
|
||||
looks like this::
|
||||
|
||||
with obj:
|
||||
a = 1 # equivalent to obj.a = 1
|
||||
total = total + 1 # obj.total = obj.total + 1
|
||||
|
||||
In Python, such a construct would be ambiguous.
|
||||
|
||||
Other languages, such as Object Pascal, Delphi, and C++, use static types, so
|
||||
it's possible to know, in an unambiguous way, what member is being assigned
|
||||
to. This is the main point of static typing -- the compiler *always* knows the
|
||||
scope of every variable at compile time.
|
||||
|
||||
Python uses dynamic types. It is impossible to know in advance which attribute
|
||||
will be referenced at runtime. Member attributes may be added or removed from
|
||||
objects on the fly. This makes it impossible to know, from a simple reading,
|
||||
what attribute is being referenced: a local one, a global one, or a member
|
||||
attribute?
|
||||
|
||||
For instance, take the following incomplete snippet::
|
||||
|
||||
def foo(a):
|
||||
with a:
|
||||
print(x)
|
||||
|
||||
The snippet assumes that "a" must have a member attribute called "x". However,
|
||||
there is nothing in Python that tells the interpreter this. What should happen
|
||||
if "a" is, let us say, an integer? If there is a global variable named "x",
|
||||
will it be used inside the with block? As you see, the dynamic nature of Python
|
||||
makes such choices much harder.
|
||||
|
||||
The primary benefit of "with" and similar language features (reduction of code
|
||||
volume) can, however, easily be achieved in Python by assignment. Instead of::
|
||||
|
||||
function(args).mydict[index][index].a = 21
|
||||
function(args).mydict[index][index].b = 42
|
||||
function(args).mydict[index][index].c = 63
|
||||
|
||||
write this::
|
||||
|
||||
ref = function(args).mydict[index][index]
|
||||
ref.a = 21
|
||||
ref.b = 42
|
||||
ref.c = 63
|
||||
|
||||
This also has the side-effect of increasing execution speed because name
|
||||
bindings are resolved at run-time in Python, and the second version only needs
|
||||
to perform the resolution once.
|
||||
|
||||
|
||||
Why are colons required for the if/while/def/class statements?
|
||||
--------------------------------------------------------------
|
||||
|
||||
The colon is required primarily to enhance readability (one of the results of
|
||||
the experimental ABC language). Consider this::
|
||||
|
||||
if a == b
|
||||
print(a)
|
||||
|
||||
versus ::
|
||||
|
||||
if a == b:
|
||||
print(a)
|
||||
|
||||
Notice how the second one is slightly easier to read. Notice further how a
|
||||
colon sets off the example in this FAQ answer; it's a standard usage in English.
|
||||
|
||||
Another minor reason is that the colon makes it easier for editors with syntax
|
||||
highlighting; they can look for colons to decide when indentation needs to be
|
||||
increased instead of having to do a more elaborate parsing of the program text.
|
||||
|
||||
|
||||
Why does Python allow commas at the end of lists and tuples?
|
||||
------------------------------------------------------------
|
||||
|
||||
Python lets you add a trailing comma at the end of lists, tuples, and
|
||||
dictionaries::
|
||||
|
||||
[1, 2, 3,]
|
||||
('a', 'b', 'c',)
|
||||
d = {
|
||||
"A": [1, 5],
|
||||
"B": [6, 7], # last trailing comma is optional but good style
|
||||
}
|
||||
|
||||
|
||||
There are several reasons to allow this.
|
||||
|
||||
When you have a literal value for a list, tuple, or dictionary spread across
|
||||
multiple lines, it's easier to add more elements because you don't have to
|
||||
remember to add a comma to the previous line. The lines can also be reordered
|
||||
without creating a syntax error.
|
||||
|
||||
Accidentally omitting the comma can lead to errors that are hard to diagnose.
|
||||
For example::
|
||||
|
||||
x = [
|
||||
"fee",
|
||||
"fie"
|
||||
"foo",
|
||||
"fum"
|
||||
]
|
||||
|
||||
This list looks like it has four elements, but it actually contains three:
|
||||
"fee", "fiefoo" and "fum". Always adding the comma avoids this source of error.
|
||||
|
||||
Allowing the trailing comma may also make programmatic code generation easier.
|
||||
447
python-3.7.4-docs-html/_sources/faq/extending.rst.txt
Normal file
447
python-3.7.4-docs-html/_sources/faq/extending.rst.txt
Normal file
@@ -0,0 +1,447 @@
|
||||
=======================
|
||||
Extending/Embedding FAQ
|
||||
=======================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. highlight:: c
|
||||
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
|
||||
|
||||
Can I create my own functions in C?
|
||||
-----------------------------------
|
||||
|
||||
Yes, you can create built-in modules containing functions, variables, exceptions
|
||||
and even new types in C. This is explained in the document
|
||||
:ref:`extending-index`.
|
||||
|
||||
Most intermediate or advanced Python books will also cover this topic.
|
||||
|
||||
|
||||
Can I create my own functions in C++?
|
||||
-------------------------------------
|
||||
|
||||
Yes, using the C compatibility features found in C++. Place ``extern "C" {
|
||||
... }`` around the Python include files and put ``extern "C"`` before each
|
||||
function that is going to be called by the Python interpreter. Global or static
|
||||
C++ objects with constructors are probably not a good idea.
|
||||
|
||||
|
||||
.. _c-wrapper-software:
|
||||
|
||||
Writing C is hard; are there any alternatives?
|
||||
----------------------------------------------
|
||||
|
||||
There are a number of alternatives to writing your own C extensions, depending
|
||||
on what you're trying to do.
|
||||
|
||||
.. XXX make sure these all work
|
||||
|
||||
`Cython <http://cython.org>`_ and its relative `Pyrex
|
||||
<https://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/>`_ are compilers
|
||||
that accept a slightly modified form of Python and generate the corresponding
|
||||
C code. Cython and Pyrex make it possible to write an extension without having
|
||||
to learn Python's C API.
|
||||
|
||||
If you need to interface to some C or C++ library for which no Python extension
|
||||
currently exists, you can try wrapping the library's data types and functions
|
||||
with a tool such as `SWIG <http://www.swig.org>`_. `SIP
|
||||
<https://riverbankcomputing.com/software/sip/intro>`__, `CXX
|
||||
<http://cxx.sourceforge.net/>`_ `Boost
|
||||
<http://www.boost.org/libs/python/doc/index.html>`_, or `Weave
|
||||
<https://github.com/scipy/weave>`_ are also
|
||||
alternatives for wrapping C++ libraries.
|
||||
|
||||
|
||||
How can I execute arbitrary Python statements from C?
|
||||
-----------------------------------------------------
|
||||
|
||||
The highest-level function to do this is :c:func:`PyRun_SimpleString` which takes
|
||||
a single string argument to be executed in the context of the module
|
||||
``__main__`` and returns ``0`` for success and ``-1`` when an exception occurred
|
||||
(including :exc:`SyntaxError`). If you want more control, use
|
||||
:c:func:`PyRun_String`; see the source for :c:func:`PyRun_SimpleString` in
|
||||
``Python/pythonrun.c``.
|
||||
|
||||
|
||||
How can I evaluate an arbitrary Python expression from C?
|
||||
---------------------------------------------------------
|
||||
|
||||
Call the function :c:func:`PyRun_String` from the previous question with the
|
||||
start symbol :c:data:`Py_eval_input`; it parses an expression, evaluates it and
|
||||
returns its value.
|
||||
|
||||
|
||||
How do I extract C values from a Python object?
|
||||
-----------------------------------------------
|
||||
|
||||
That depends on the object's type. If it's a tuple, :c:func:`PyTuple_Size`
|
||||
returns its length and :c:func:`PyTuple_GetItem` returns the item at a specified
|
||||
index. Lists have similar functions, :c:func:`PyListSize` and
|
||||
:c:func:`PyList_GetItem`.
|
||||
|
||||
For bytes, :c:func:`PyBytes_Size` returns its length and
|
||||
:c:func:`PyBytes_AsStringAndSize` provides a pointer to its value and its
|
||||
length. Note that Python bytes objects may contain null bytes so C's
|
||||
:c:func:`strlen` should not be used.
|
||||
|
||||
To test the type of an object, first make sure it isn't *NULL*, and then use
|
||||
:c:func:`PyBytes_Check`, :c:func:`PyTuple_Check`, :c:func:`PyList_Check`, etc.
|
||||
|
||||
There is also a high-level API to Python objects which is provided by the
|
||||
so-called 'abstract' interface -- read ``Include/abstract.h`` for further
|
||||
details. It allows interfacing with any kind of Python sequence using calls
|
||||
like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc. as well
|
||||
as many other useful protocols such as numbers (:c:func:`PyNumber_Index` et
|
||||
al.) and mappings in the PyMapping APIs.
|
||||
|
||||
|
||||
How do I use Py_BuildValue() to create a tuple of arbitrary length?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
You can't. Use :c:func:`PyTuple_Pack` instead.
|
||||
|
||||
|
||||
How do I call an object's method from C?
|
||||
----------------------------------------
|
||||
|
||||
The :c:func:`PyObject_CallMethod` function can be used to call an arbitrary
|
||||
method of an object. The parameters are the object, the name of the method to
|
||||
call, a format string like that used with :c:func:`Py_BuildValue`, and the
|
||||
argument values::
|
||||
|
||||
PyObject *
|
||||
PyObject_CallMethod(PyObject *object, const char *method_name,
|
||||
const char *arg_format, ...);
|
||||
|
||||
This works for any object that has methods -- whether built-in or user-defined.
|
||||
You are responsible for eventually :c:func:`Py_DECREF`\ 'ing the return value.
|
||||
|
||||
To call, e.g., a file object's "seek" method with arguments 10, 0 (assuming the
|
||||
file object pointer is "f")::
|
||||
|
||||
res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0);
|
||||
if (res == NULL) {
|
||||
... an exception occurred ...
|
||||
}
|
||||
else {
|
||||
Py_DECREF(res);
|
||||
}
|
||||
|
||||
Note that since :c:func:`PyObject_CallObject` *always* wants a tuple for the
|
||||
argument list, to call a function without arguments, pass "()" for the format,
|
||||
and to call a function with one argument, surround the argument in parentheses,
|
||||
e.g. "(i)".
|
||||
|
||||
|
||||
How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?
|
||||
----------------------------------------------------------------------------------------
|
||||
|
||||
In Python code, define an object that supports the ``write()`` method. Assign
|
||||
this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or
|
||||
just allow the standard traceback mechanism to work. Then, the output will go
|
||||
wherever your ``write()`` method sends it.
|
||||
|
||||
The easiest way to do this is to use the :class:`io.StringIO` class:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import io, sys
|
||||
>>> sys.stdout = io.StringIO()
|
||||
>>> print('foo')
|
||||
>>> print('hello world!')
|
||||
>>> sys.stderr.write(sys.stdout.getvalue())
|
||||
foo
|
||||
hello world!
|
||||
|
||||
A custom object to do the same would look like this:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> import io, sys
|
||||
>>> class StdoutCatcher(io.TextIOBase):
|
||||
... def __init__(self):
|
||||
... self.data = []
|
||||
... def write(self, stuff):
|
||||
... self.data.append(stuff)
|
||||
...
|
||||
>>> import sys
|
||||
>>> sys.stdout = StdoutCatcher()
|
||||
>>> print('foo')
|
||||
>>> print('hello world!')
|
||||
>>> sys.stderr.write(''.join(sys.stdout.data))
|
||||
foo
|
||||
hello world!
|
||||
|
||||
|
||||
How do I access a module written in Python from C?
|
||||
--------------------------------------------------
|
||||
|
||||
You can get a pointer to the module object as follows::
|
||||
|
||||
module = PyImport_ImportModule("<modulename>");
|
||||
|
||||
If the module hasn't been imported yet (i.e. it is not yet present in
|
||||
:data:`sys.modules`), this initializes the module; otherwise it simply returns
|
||||
the value of ``sys.modules["<modulename>"]``. Note that it doesn't enter the
|
||||
module into any namespace -- it only ensures it has been initialized and is
|
||||
stored in :data:`sys.modules`.
|
||||
|
||||
You can then access the module's attributes (i.e. any name defined in the
|
||||
module) as follows::
|
||||
|
||||
attr = PyObject_GetAttrString(module, "<attrname>");
|
||||
|
||||
Calling :c:func:`PyObject_SetAttrString` to assign to variables in the module
|
||||
also works.
|
||||
|
||||
|
||||
How do I interface to C++ objects from Python?
|
||||
----------------------------------------------
|
||||
|
||||
Depending on your requirements, there are many approaches. To do this manually,
|
||||
begin by reading :ref:`the "Extending and Embedding" document
|
||||
<extending-index>`. Realize that for the Python run-time system, there isn't a
|
||||
whole lot of difference between C and C++ -- so the strategy of building a new
|
||||
Python type around a C structure (pointer) type will also work for C++ objects.
|
||||
|
||||
For C++ libraries, see :ref:`c-wrapper-software`.
|
||||
|
||||
|
||||
I added a module using the Setup file and the make fails; why?
|
||||
--------------------------------------------------------------
|
||||
|
||||
Setup must end in a newline, if there is no newline there, the build process
|
||||
fails. (Fixing this requires some ugly shell script hackery, and this bug is so
|
||||
minor that it doesn't seem worth the effort.)
|
||||
|
||||
|
||||
How do I debug an extension?
|
||||
----------------------------
|
||||
|
||||
When using GDB with dynamically loaded extensions, you can't set a breakpoint in
|
||||
your extension until your extension is loaded.
|
||||
|
||||
In your ``.gdbinit`` file (or interactively), add the command:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
br _PyImport_LoadDynamicModule
|
||||
|
||||
Then, when you run GDB:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ gdb /local/bin/python
|
||||
gdb) run myscript.py
|
||||
gdb) continue # repeat until your extension is loaded
|
||||
gdb) finish # so that your extension is loaded
|
||||
gdb) br myfunction.c:50
|
||||
gdb) continue
|
||||
|
||||
I want to compile a Python module on my Linux system, but some files are missing. Why?
|
||||
--------------------------------------------------------------------------------------
|
||||
|
||||
Most packaged versions of Python don't include the
|
||||
:file:`/usr/lib/python2.{x}/config/` directory, which contains various files
|
||||
required for compiling Python extensions.
|
||||
|
||||
For Red Hat, install the python-devel RPM to get the necessary files.
|
||||
|
||||
For Debian, run ``apt-get install python-dev``.
|
||||
|
||||
|
||||
How do I tell "incomplete input" from "invalid input"?
|
||||
------------------------------------------------------
|
||||
|
||||
Sometimes you want to emulate the Python interactive interpreter's behavior,
|
||||
where it gives you a continuation prompt when the input is incomplete (e.g. you
|
||||
typed the start of an "if" statement or you didn't close your parentheses or
|
||||
triple string quotes), but it gives you a syntax error message immediately when
|
||||
the input is invalid.
|
||||
|
||||
In Python you can use the :mod:`codeop` module, which approximates the parser's
|
||||
behavior sufficiently. IDLE uses this, for example.
|
||||
|
||||
The easiest way to do it in C is to call :c:func:`PyRun_InteractiveLoop` (perhaps
|
||||
in a separate thread) and let the Python interpreter handle the input for
|
||||
you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at your
|
||||
custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c``
|
||||
for more hints.
|
||||
|
||||
However sometimes you have to run the embedded Python interpreter in the same
|
||||
thread as your rest application and you can't allow the
|
||||
:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input. The one
|
||||
solution then is to call :c:func:`PyParser_ParseString` and test for ``e.error``
|
||||
equal to ``E_EOF``, which means the input is incomplete. Here's a sample code
|
||||
fragment, untested, inspired by code from Alex Farber::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <node.h>
|
||||
#include <errcode.h>
|
||||
#include <grammar.h>
|
||||
#include <parsetok.h>
|
||||
#include <compile.h>
|
||||
|
||||
int testcomplete(char *code)
|
||||
/* code should end in \n */
|
||||
/* return -1 for error, 0 for incomplete, 1 for complete */
|
||||
{
|
||||
node *n;
|
||||
perrdetail e;
|
||||
|
||||
n = PyParser_ParseString(code, &_PyParser_Grammar,
|
||||
Py_file_input, &e);
|
||||
if (n == NULL) {
|
||||
if (e.error == E_EOF)
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
PyNode_Free(n);
|
||||
return 1;
|
||||
}
|
||||
|
||||
Another solution is trying to compile the received string with
|
||||
:c:func:`Py_CompileString`. If it compiles without errors, try to execute the
|
||||
returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the
|
||||
input for later. If the compilation fails, find out if it's an error or just
|
||||
more input is required - by extracting the message string from the exception
|
||||
tuple and comparing it to the string "unexpected EOF while parsing". Here is a
|
||||
complete example using the GNU readline library (you may want to ignore
|
||||
**SIGINT** while calling readline())::
|
||||
|
||||
#include <stdio.h>
|
||||
#include <readline.h>
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <object.h>
|
||||
#include <compile.h>
|
||||
#include <eval.h>
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
int i, j, done = 0; /* lengths of line, code */
|
||||
char ps1[] = ">>> ";
|
||||
char ps2[] = "... ";
|
||||
char *prompt = ps1;
|
||||
char *msg, *line, *code = NULL;
|
||||
PyObject *src, *glb, *loc;
|
||||
PyObject *exc, *val, *trb, *obj, *dum;
|
||||
|
||||
Py_Initialize ();
|
||||
loc = PyDict_New ();
|
||||
glb = PyDict_New ();
|
||||
PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ());
|
||||
|
||||
while (!done)
|
||||
{
|
||||
line = readline (prompt);
|
||||
|
||||
if (NULL == line) /* Ctrl-D pressed */
|
||||
{
|
||||
done = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = strlen (line);
|
||||
|
||||
if (i > 0)
|
||||
add_history (line); /* save non-empty lines */
|
||||
|
||||
if (NULL == code) /* nothing in code yet */
|
||||
j = 0;
|
||||
else
|
||||
j = strlen (code);
|
||||
|
||||
code = realloc (code, i + j + 2);
|
||||
if (NULL == code) /* out of memory */
|
||||
exit (1);
|
||||
|
||||
if (0 == j) /* code was empty, so */
|
||||
code[0] = '\0'; /* keep strncat happy */
|
||||
|
||||
strncat (code, line, i); /* append line to code */
|
||||
code[i + j] = '\n'; /* append '\n' to code */
|
||||
code[i + j + 1] = '\0';
|
||||
|
||||
src = Py_CompileString (code, "<stdin>", Py_single_input);
|
||||
|
||||
if (NULL != src) /* compiled just fine - */
|
||||
{
|
||||
if (ps1 == prompt || /* ">>> " or */
|
||||
'\n' == code[i + j - 1]) /* "... " and double '\n' */
|
||||
{ /* so execute it */
|
||||
dum = PyEval_EvalCode (src, glb, loc);
|
||||
Py_XDECREF (dum);
|
||||
Py_XDECREF (src);
|
||||
free (code);
|
||||
code = NULL;
|
||||
if (PyErr_Occurred ())
|
||||
PyErr_Print ();
|
||||
prompt = ps1;
|
||||
}
|
||||
} /* syntax error or E_EOF? */
|
||||
else if (PyErr_ExceptionMatches (PyExc_SyntaxError))
|
||||
{
|
||||
PyErr_Fetch (&exc, &val, &trb); /* clears exception! */
|
||||
|
||||
if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
|
||||
!strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
|
||||
{
|
||||
Py_XDECREF (exc);
|
||||
Py_XDECREF (val);
|
||||
Py_XDECREF (trb);
|
||||
prompt = ps2;
|
||||
}
|
||||
else /* some other syntax error */
|
||||
{
|
||||
PyErr_Restore (exc, val, trb);
|
||||
PyErr_Print ();
|
||||
free (code);
|
||||
code = NULL;
|
||||
prompt = ps1;
|
||||
}
|
||||
}
|
||||
else /* some non-syntax error */
|
||||
{
|
||||
PyErr_Print ();
|
||||
free (code);
|
||||
code = NULL;
|
||||
prompt = ps1;
|
||||
}
|
||||
|
||||
free (line);
|
||||
}
|
||||
}
|
||||
|
||||
Py_XDECREF(glb);
|
||||
Py_XDECREF(loc);
|
||||
Py_Finalize();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
How do I find undefined g++ symbols __builtin_new or __pure_virtual?
|
||||
--------------------------------------------------------------------
|
||||
|
||||
To dynamically load g++ extension modules, you must recompile Python, relink it
|
||||
using g++ (change LINKCC in the Python Modules Makefile), and link your
|
||||
extension module using g++ (e.g., ``g++ -shared -o mymodule.so mymodule.o``).
|
||||
|
||||
|
||||
Can I create an object class with some methods implemented in C and others in Python (e.g. through inheritance)?
|
||||
----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Yes, you can inherit from built-in classes such as :class:`int`, :class:`list`,
|
||||
:class:`dict`, etc.
|
||||
|
||||
The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html)
|
||||
provides a way of doing this from C++ (i.e. you can inherit from an extension
|
||||
class written in C++ using the BPL).
|
||||
446
python-3.7.4-docs-html/_sources/faq/general.rst.txt
Normal file
446
python-3.7.4-docs-html/_sources/faq/general.rst.txt
Normal file
@@ -0,0 +1,446 @@
|
||||
:tocdepth: 2
|
||||
|
||||
==================
|
||||
General Python FAQ
|
||||
==================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
General Information
|
||||
===================
|
||||
|
||||
What is Python?
|
||||
---------------
|
||||
|
||||
Python is an interpreted, interactive, object-oriented programming language. It
|
||||
incorporates modules, exceptions, dynamic typing, very high level dynamic data
|
||||
types, and classes. Python combines remarkable power with very clear syntax.
|
||||
It has interfaces to many system calls and libraries, as well as to various
|
||||
window systems, and is extensible in C or C++. It is also usable as an
|
||||
extension language for applications that need a programmable interface.
|
||||
Finally, Python is portable: it runs on many Unix variants, on the Mac, and on
|
||||
Windows 2000 and later.
|
||||
|
||||
To find out more, start with :ref:`tutorial-index`. The `Beginner's Guide to
|
||||
Python <https://wiki.python.org/moin/BeginnersGuide>`_ links to other
|
||||
introductory tutorials and resources for learning Python.
|
||||
|
||||
|
||||
What is the Python Software Foundation?
|
||||
---------------------------------------
|
||||
|
||||
The Python Software Foundation is an independent non-profit organization that
|
||||
holds the copyright on Python versions 2.1 and newer. The PSF's mission is to
|
||||
advance open source technology related to the Python programming language and to
|
||||
publicize the use of Python. The PSF's home page is at
|
||||
https://www.python.org/psf/.
|
||||
|
||||
Donations to the PSF are tax-exempt in the US. If you use Python and find it
|
||||
helpful, please contribute via `the PSF donation page
|
||||
<https://www.python.org/psf/donations/>`_.
|
||||
|
||||
|
||||
Are there copyright restrictions on the use of Python?
|
||||
------------------------------------------------------
|
||||
|
||||
You can do anything you want with the source, as long as you leave the
|
||||
copyrights in and display those copyrights in any documentation about Python
|
||||
that you produce. If you honor the copyright rules, it's OK to use Python for
|
||||
commercial use, to sell copies of Python in source or binary form (modified or
|
||||
unmodified), or to sell products that incorporate Python in some form. We would
|
||||
still like to know about all commercial use of Python, of course.
|
||||
|
||||
See `the PSF license page <https://www.python.org/psf/license/>`_ to find further
|
||||
explanations and a link to the full text of the license.
|
||||
|
||||
The Python logo is trademarked, and in certain cases permission is required to
|
||||
use it. Consult `the Trademark Usage Policy
|
||||
<https://www.python.org/psf/trademarks/>`__ for more information.
|
||||
|
||||
|
||||
Why was Python created in the first place?
|
||||
------------------------------------------
|
||||
|
||||
Here's a *very* brief summary of what started it all, written by Guido van
|
||||
Rossum:
|
||||
|
||||
I had extensive experience with implementing an interpreted language in the
|
||||
ABC group at CWI, and from working with this group I had learned a lot about
|
||||
language design. This is the origin of many Python features, including the
|
||||
use of indentation for statement grouping and the inclusion of
|
||||
very-high-level data types (although the details are all different in
|
||||
Python).
|
||||
|
||||
I had a number of gripes about the ABC language, but also liked many of its
|
||||
features. It was impossible to extend the ABC language (or its
|
||||
implementation) to remedy my complaints -- in fact its lack of extensibility
|
||||
was one of its biggest problems. I had some experience with using Modula-2+
|
||||
and talked with the designers of Modula-3 and read the Modula-3 report.
|
||||
Modula-3 is the origin of the syntax and semantics used for exceptions, and
|
||||
some other Python features.
|
||||
|
||||
I was working in the Amoeba distributed operating system group at CWI. We
|
||||
needed a better way to do system administration than by writing either C
|
||||
programs or Bourne shell scripts, since Amoeba had its own system call
|
||||
interface which wasn't easily accessible from the Bourne shell. My
|
||||
experience with error handling in Amoeba made me acutely aware of the
|
||||
importance of exceptions as a programming language feature.
|
||||
|
||||
It occurred to me that a scripting language with a syntax like ABC but with
|
||||
access to the Amoeba system calls would fill the need. I realized that it
|
||||
would be foolish to write an Amoeba-specific language, so I decided that I
|
||||
needed a language that was generally extensible.
|
||||
|
||||
During the 1989 Christmas holidays, I had a lot of time on my hand, so I
|
||||
decided to give it a try. During the next year, while still mostly working
|
||||
on it in my own time, Python was used in the Amoeba project with increasing
|
||||
success, and the feedback from colleagues made me add many early
|
||||
improvements.
|
||||
|
||||
In February 1991, after just over a year of development, I decided to post to
|
||||
USENET. The rest is in the ``Misc/HISTORY`` file.
|
||||
|
||||
|
||||
What is Python good for?
|
||||
------------------------
|
||||
|
||||
Python is a high-level general-purpose programming language that can be applied
|
||||
to many different classes of problems.
|
||||
|
||||
The language comes with a large standard library that covers areas such as
|
||||
string processing (regular expressions, Unicode, calculating differences between
|
||||
files), Internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP, CGI
|
||||
programming), software engineering (unit testing, logging, profiling, parsing
|
||||
Python code), and operating system interfaces (system calls, filesystems, TCP/IP
|
||||
sockets). Look at the table of contents for :ref:`library-index` to get an idea
|
||||
of what's available. A wide variety of third-party extensions are also
|
||||
available. Consult `the Python Package Index <https://pypi.org>`_ to
|
||||
find packages of interest to you.
|
||||
|
||||
|
||||
How does the Python version numbering scheme work?
|
||||
--------------------------------------------------
|
||||
|
||||
Python versions are numbered A.B.C or A.B. A is the major version number -- it
|
||||
is only incremented for really major changes in the language. B is the minor
|
||||
version number, incremented for less earth-shattering changes. C is the
|
||||
micro-level -- it is incremented for each bugfix release. See :pep:`6` for more
|
||||
information about bugfix releases.
|
||||
|
||||
Not all releases are bugfix releases. In the run-up to a new major release, a
|
||||
series of development releases are made, denoted as alpha, beta, or release
|
||||
candidate. Alphas are early releases in which interfaces aren't yet finalized;
|
||||
it's not unexpected to see an interface change between two alpha releases.
|
||||
Betas are more stable, preserving existing interfaces but possibly adding new
|
||||
modules, and release candidates are frozen, making no changes except as needed
|
||||
to fix critical bugs.
|
||||
|
||||
Alpha, beta and release candidate versions have an additional suffix. The
|
||||
suffix for an alpha version is "aN" for some small number N, the suffix for a
|
||||
beta version is "bN" for some small number N, and the suffix for a release
|
||||
candidate version is "cN" for some small number N. In other words, all versions
|
||||
labeled 2.0aN precede the versions labeled 2.0bN, which precede versions labeled
|
||||
2.0cN, and *those* precede 2.0.
|
||||
|
||||
You may also find version numbers with a "+" suffix, e.g. "2.2+". These are
|
||||
unreleased versions, built directly from the CPython development repository. In
|
||||
practice, after a final minor release is made, the version is incremented to the
|
||||
next minor version, which becomes the "a0" version, e.g. "2.4a0".
|
||||
|
||||
See also the documentation for :data:`sys.version`, :data:`sys.hexversion`, and
|
||||
:data:`sys.version_info`.
|
||||
|
||||
|
||||
How do I obtain a copy of the Python source?
|
||||
--------------------------------------------
|
||||
|
||||
The latest Python source distribution is always available from python.org, at
|
||||
https://www.python.org/downloads/. The latest development sources can be obtained
|
||||
at https://github.com/python/cpython/.
|
||||
|
||||
The source distribution is a gzipped tar file containing the complete C source,
|
||||
Sphinx-formatted documentation, Python library modules, example programs, and
|
||||
several useful pieces of freely distributable software. The source will compile
|
||||
and run out of the box on most UNIX platforms.
|
||||
|
||||
Consult the `Getting Started section of the Python Developer's Guide
|
||||
<https://devguide.python.org/setup/>`__ for more
|
||||
information on getting the source code and compiling it.
|
||||
|
||||
|
||||
How do I get documentation on Python?
|
||||
-------------------------------------
|
||||
|
||||
.. XXX mention py3k
|
||||
|
||||
The standard documentation for the current stable version of Python is available
|
||||
at https://docs.python.org/3/. PDF, plain text, and downloadable HTML versions are
|
||||
also available at https://docs.python.org/3/download.html.
|
||||
|
||||
The documentation is written in reStructuredText and processed by `the Sphinx
|
||||
documentation tool <http://sphinx-doc.org/>`__. The reStructuredText source for
|
||||
the documentation is part of the Python source distribution.
|
||||
|
||||
|
||||
I've never programmed before. Is there a Python tutorial?
|
||||
---------------------------------------------------------
|
||||
|
||||
There are numerous tutorials and books available. The standard documentation
|
||||
includes :ref:`tutorial-index`.
|
||||
|
||||
Consult `the Beginner's Guide <https://wiki.python.org/moin/BeginnersGuide>`_ to
|
||||
find information for beginning Python programmers, including lists of tutorials.
|
||||
|
||||
|
||||
Is there a newsgroup or mailing list devoted to Python?
|
||||
-------------------------------------------------------
|
||||
|
||||
There is a newsgroup, :newsgroup:`comp.lang.python`, and a mailing list,
|
||||
`python-list <https://mail.python.org/mailman/listinfo/python-list>`_. The
|
||||
newsgroup and mailing list are gatewayed into each other -- if you can read news
|
||||
it's unnecessary to subscribe to the mailing list.
|
||||
:newsgroup:`comp.lang.python` is high-traffic, receiving hundreds of postings
|
||||
every day, and Usenet readers are often more able to cope with this volume.
|
||||
|
||||
Announcements of new software releases and events can be found in
|
||||
comp.lang.python.announce, a low-traffic moderated list that receives about five
|
||||
postings per day. It's available as `the python-announce mailing list
|
||||
<https://mail.python.org/mailman/listinfo/python-announce-list>`_.
|
||||
|
||||
More info about other mailing lists and newsgroups
|
||||
can be found at https://www.python.org/community/lists/.
|
||||
|
||||
|
||||
How do I get a beta test version of Python?
|
||||
-------------------------------------------
|
||||
|
||||
Alpha and beta releases are available from https://www.python.org/downloads/. All
|
||||
releases are announced on the comp.lang.python and comp.lang.python.announce
|
||||
newsgroups and on the Python home page at https://www.python.org/; an RSS feed of
|
||||
news is available.
|
||||
|
||||
You can also access the development version of Python through Git. See
|
||||
`The Python Developer's Guide <https://devguide.python.org/>`_ for details.
|
||||
|
||||
|
||||
How do I submit bug reports and patches for Python?
|
||||
---------------------------------------------------
|
||||
|
||||
To report a bug or submit a patch, please use the Roundup installation at
|
||||
https://bugs.python.org/.
|
||||
|
||||
You must have a Roundup account to report bugs; this makes it possible for us to
|
||||
contact you if we have follow-up questions. It will also enable Roundup to send
|
||||
you updates as we act on your bug. If you had previously used SourceForge to
|
||||
report bugs to Python, you can obtain your Roundup password through Roundup's
|
||||
`password reset procedure <https://bugs.python.org/user?@template=forgotten>`_.
|
||||
|
||||
For more information on how Python is developed, consult `the Python Developer's
|
||||
Guide <https://devguide.python.org/>`_.
|
||||
|
||||
|
||||
Are there any published articles about Python that I can reference?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
It's probably best to cite your favorite book about Python.
|
||||
|
||||
The very first article about Python was written in 1991 and is now quite
|
||||
outdated.
|
||||
|
||||
Guido van Rossum and Jelke de Boer, "Interactively Testing Remote Servers
|
||||
Using the Python Programming Language", CWI Quarterly, Volume 4, Issue 4
|
||||
(December 1991), Amsterdam, pp 283--303.
|
||||
|
||||
|
||||
Are there any books on Python?
|
||||
------------------------------
|
||||
|
||||
Yes, there are many, and more are being published. See the python.org wiki at
|
||||
https://wiki.python.org/moin/PythonBooks for a list.
|
||||
|
||||
You can also search online bookstores for "Python" and filter out the Monty
|
||||
Python references; or perhaps search for "Python" and "language".
|
||||
|
||||
|
||||
Where in the world is www.python.org located?
|
||||
---------------------------------------------
|
||||
|
||||
The Python project's infrastructure is located all over the world and is managed
|
||||
by the Python Infrastructure Team. Details `here <http://infra.psf.io>`__.
|
||||
|
||||
|
||||
Why is it called Python?
|
||||
------------------------
|
||||
|
||||
When he began implementing Python, Guido van Rossum was also reading the
|
||||
published scripts from `"Monty Python's Flying Circus"
|
||||
<https://en.wikipedia.org/wiki/Monty_Python>`__, a BBC comedy series from the 1970s. Van Rossum
|
||||
thought he needed a name that was short, unique, and slightly mysterious, so he
|
||||
decided to call the language Python.
|
||||
|
||||
|
||||
Do I have to like "Monty Python's Flying Circus"?
|
||||
-------------------------------------------------
|
||||
|
||||
No, but it helps. :)
|
||||
|
||||
|
||||
Python in the real world
|
||||
========================
|
||||
|
||||
How stable is Python?
|
||||
---------------------
|
||||
|
||||
Very stable. New, stable releases have been coming out roughly every 6 to 18
|
||||
months since 1991, and this seems likely to continue. Currently there are
|
||||
usually around 18 months between major releases.
|
||||
|
||||
The developers issue "bugfix" releases of older versions, so the stability of
|
||||
existing releases gradually improves. Bugfix releases, indicated by a third
|
||||
component of the version number (e.g. 3.5.3, 3.6.2), are managed for stability;
|
||||
only fixes for known problems are included in a bugfix release, and it's
|
||||
guaranteed that interfaces will remain the same throughout a series of bugfix
|
||||
releases.
|
||||
|
||||
The latest stable releases can always be found on the `Python download page
|
||||
<https://www.python.org/downloads/>`_. There are two production-ready versions
|
||||
of Python: 2.x and 3.x. The recommended version is 3.x, which is supported by
|
||||
most widely used libraries. Although 2.x is still widely used, `it will not
|
||||
be maintained after January 1, 2020 <https://www.python.org/dev/peps/pep-0373/>`_.
|
||||
|
||||
How many people are using Python?
|
||||
---------------------------------
|
||||
|
||||
There are probably tens of thousands of users, though it's difficult to obtain
|
||||
an exact count.
|
||||
|
||||
Python is available for free download, so there are no sales figures, and it's
|
||||
available from many different sites and packaged with many Linux distributions,
|
||||
so download statistics don't tell the whole story either.
|
||||
|
||||
The comp.lang.python newsgroup is very active, but not all Python users post to
|
||||
the group or even read it.
|
||||
|
||||
|
||||
Have any significant projects been done in Python?
|
||||
--------------------------------------------------
|
||||
|
||||
See https://www.python.org/about/success for a list of projects that use Python.
|
||||
Consulting the proceedings for `past Python conferences
|
||||
<https://www.python.org/community/workshops/>`_ will reveal contributions from many
|
||||
different companies and organizations.
|
||||
|
||||
High-profile Python projects include `the Mailman mailing list manager
|
||||
<http://www.list.org>`_ and `the Zope application server
|
||||
<http://www.zope.org>`_. Several Linux distributions, most notably `Red Hat
|
||||
<https://www.redhat.com>`_, have written part or all of their installer and
|
||||
system administration software in Python. Companies that use Python internally
|
||||
include Google, Yahoo, and Lucasfilm Ltd.
|
||||
|
||||
|
||||
What new developments are expected for Python in the future?
|
||||
------------------------------------------------------------
|
||||
|
||||
See https://www.python.org/dev/peps/ for the Python Enhancement Proposals
|
||||
(PEPs). PEPs are design documents describing a suggested new feature for Python,
|
||||
providing a concise technical specification and a rationale. Look for a PEP
|
||||
titled "Python X.Y Release Schedule", where X.Y is a version that hasn't been
|
||||
publicly released yet.
|
||||
|
||||
New development is discussed on `the python-dev mailing list
|
||||
<https://mail.python.org/mailman/listinfo/python-dev/>`_.
|
||||
|
||||
|
||||
Is it reasonable to propose incompatible changes to Python?
|
||||
-----------------------------------------------------------
|
||||
|
||||
In general, no. There are already millions of lines of Python code around the
|
||||
world, so any change in the language that invalidates more than a very small
|
||||
fraction of existing programs has to be frowned upon. Even if you can provide a
|
||||
conversion program, there's still the problem of updating all documentation;
|
||||
many books have been written about Python, and we don't want to invalidate them
|
||||
all at a single stroke.
|
||||
|
||||
Providing a gradual upgrade path is necessary if a feature has to be changed.
|
||||
:pep:`5` describes the procedure followed for introducing backward-incompatible
|
||||
changes while minimizing disruption for users.
|
||||
|
||||
|
||||
Is Python a good language for beginning programmers?
|
||||
----------------------------------------------------
|
||||
|
||||
Yes.
|
||||
|
||||
It is still common to start students with a procedural and statically typed
|
||||
language such as Pascal, C, or a subset of C++ or Java. Students may be better
|
||||
served by learning Python as their first language. Python has a very simple and
|
||||
consistent syntax and a large standard library and, most importantly, using
|
||||
Python in a beginning programming course lets students concentrate on important
|
||||
programming skills such as problem decomposition and data type design. With
|
||||
Python, students can be quickly introduced to basic concepts such as loops and
|
||||
procedures. They can probably even work with user-defined objects in their very
|
||||
first course.
|
||||
|
||||
For a student who has never programmed before, using a statically typed language
|
||||
seems unnatural. It presents additional complexity that the student must master
|
||||
and slows the pace of the course. The students are trying to learn to think
|
||||
like a computer, decompose problems, design consistent interfaces, and
|
||||
encapsulate data. While learning to use a statically typed language is
|
||||
important in the long term, it is not necessarily the best topic to address in
|
||||
the students' first programming course.
|
||||
|
||||
Many other aspects of Python make it a good first language. Like Java, Python
|
||||
has a large standard library so that students can be assigned programming
|
||||
projects very early in the course that *do* something. Assignments aren't
|
||||
restricted to the standard four-function calculator and check balancing
|
||||
programs. By using the standard library, students can gain the satisfaction of
|
||||
working on realistic applications as they learn the fundamentals of programming.
|
||||
Using the standard library also teaches students about code reuse. Third-party
|
||||
modules such as PyGame are also helpful in extending the students' reach.
|
||||
|
||||
Python's interactive interpreter enables students to test language features
|
||||
while they're programming. They can keep a window with the interpreter running
|
||||
while they enter their program's source in another window. If they can't
|
||||
remember the methods for a list, they can do something like this::
|
||||
|
||||
>>> L = []
|
||||
>>> dir(L) # doctest: +NORMALIZE_WHITESPACE
|
||||
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
|
||||
'__dir__', '__doc__', '__eq__', '__format__', '__ge__',
|
||||
'__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__',
|
||||
'__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
|
||||
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
|
||||
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__',
|
||||
'__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
|
||||
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove',
|
||||
'reverse', 'sort']
|
||||
>>> [d for d in dir(L) if '__' not in d]
|
||||
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
|
||||
|
||||
>>> help(L.append)
|
||||
Help on built-in function append:
|
||||
<BLANKLINE>
|
||||
append(...)
|
||||
L.append(object) -> None -- append object to end
|
||||
<BLANKLINE>
|
||||
>>> L.append(1)
|
||||
>>> L
|
||||
[1]
|
||||
|
||||
With the interpreter, documentation is never far from the student as they are
|
||||
programming.
|
||||
|
||||
There are also good IDEs for Python. IDLE is a cross-platform IDE for Python
|
||||
that is written in Python using Tkinter. PythonWin is a Windows-specific IDE.
|
||||
Emacs users will be happy to know that there is a very good Python mode for
|
||||
Emacs. All of these programming environments provide syntax highlighting,
|
||||
auto-indenting, and access to the interactive interpreter while coding. Consult
|
||||
`the Python wiki <https://wiki.python.org/moin/PythonEditors>`_ for a full list
|
||||
of Python editing environments.
|
||||
|
||||
If you want to discuss Python's use in education, you may be interested in
|
||||
joining `the edu-sig mailing list
|
||||
<https://www.python.org/community/sigs/current/edu-sig>`_.
|
||||
159
python-3.7.4-docs-html/_sources/faq/gui.rst.txt
Normal file
159
python-3.7.4-docs-html/_sources/faq/gui.rst.txt
Normal file
@@ -0,0 +1,159 @@
|
||||
:tocdepth: 2
|
||||
|
||||
==========================
|
||||
Graphic User Interface FAQ
|
||||
==========================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
|
||||
|
||||
General GUI Questions
|
||||
=====================
|
||||
|
||||
What platform-independent GUI toolkits exist for Python?
|
||||
========================================================
|
||||
|
||||
Depending on what platform(s) you are aiming at, there are several. Some
|
||||
of them haven't been ported to Python 3 yet. At least `Tkinter`_ and `Qt`_
|
||||
are known to be Python 3-compatible.
|
||||
|
||||
.. XXX check links
|
||||
|
||||
Tkinter
|
||||
-------
|
||||
|
||||
Standard builds of Python include an object-oriented interface to the Tcl/Tk
|
||||
widget set, called :ref:`tkinter <Tkinter>`. This is probably the easiest to
|
||||
install (since it comes included with most
|
||||
`binary distributions <https://www.python.org/downloads/>`_ of Python) and use.
|
||||
For more info about Tk, including pointers to the source, see the
|
||||
`Tcl/Tk home page <https://www.tcl.tk>`_. Tcl/Tk is fully portable to the
|
||||
Mac OS X, Windows, and Unix platforms.
|
||||
|
||||
wxWidgets
|
||||
---------
|
||||
|
||||
wxWidgets (https://www.wxwidgets.org) is a free, portable GUI class
|
||||
library written in C++ that provides a native look and feel on a
|
||||
number of platforms, with Windows, Mac OS X, GTK, X11, all listed as
|
||||
current stable targets. Language bindings are available for a number
|
||||
of languages including Python, Perl, Ruby, etc.
|
||||
|
||||
`wxPython <https://www.wxpython.org>`_ is the Python binding for
|
||||
wxwidgets. While it often lags slightly behind the official wxWidgets
|
||||
releases, it also offers a number of features via pure Python
|
||||
extensions that are not available in other language bindings. There
|
||||
is an active wxPython user and developer community.
|
||||
|
||||
Both wxWidgets and wxPython are free, open source, software with
|
||||
permissive licences that allow their use in commercial products as
|
||||
well as in freeware or shareware.
|
||||
|
||||
|
||||
Qt
|
||||
---
|
||||
|
||||
There are bindings available for the Qt toolkit (using either `PyQt
|
||||
<https://riverbankcomputing.com/software/pyqt/intro>`_ or `PySide
|
||||
<https://wiki.qt.io/PySide>`_) and for KDE (`PyKDE4 <https://techbase.kde.org/Languages/Python/Using_PyKDE_4>`__).
|
||||
PyQt is currently more mature than PySide, but you must buy a PyQt license from
|
||||
`Riverbank Computing <https://www.riverbankcomputing.com/commercial/license-faq>`_
|
||||
if you want to write proprietary applications. PySide is free for all applications.
|
||||
|
||||
Qt 4.5 upwards is licensed under the LGPL license; also, commercial licenses
|
||||
are available from `The Qt Company <https://www.qt.io/licensing/>`_.
|
||||
|
||||
Gtk+
|
||||
----
|
||||
|
||||
The `GObject introspection bindings <https://wiki.gnome.org/Projects/PyGObject>`_
|
||||
for Python allow you to write GTK+ 3 applications. There is also a
|
||||
`Python GTK+ 3 Tutorial <https://python-gtk-3-tutorial.readthedocs.io>`_.
|
||||
|
||||
The older PyGtk bindings for the `Gtk+ 2 toolkit <https://www.gtk.org>`_ have
|
||||
been implemented by James Henstridge; see <http://www.pygtk.org>.
|
||||
|
||||
Kivy
|
||||
----
|
||||
|
||||
`Kivy <https://kivy.org/>`_ is a cross-platform GUI library supporting both
|
||||
desktop operating systems (Windows, macOS, Linux) and mobile devices (Android,
|
||||
iOS). It is written in Python and Cython, and can use a range of windowing
|
||||
backends.
|
||||
|
||||
Kivy is free and open source software distributed under the MIT license.
|
||||
|
||||
FLTK
|
||||
----
|
||||
|
||||
Python bindings for `the FLTK toolkit <http://www.fltk.org>`_, a simple yet
|
||||
powerful and mature cross-platform windowing system, are available from `the
|
||||
PyFLTK project <http://pyfltk.sourceforge.net>`_.
|
||||
|
||||
OpenGL
|
||||
------
|
||||
|
||||
For OpenGL bindings, see `PyOpenGL <http://pyopengl.sourceforge.net>`_.
|
||||
|
||||
|
||||
What platform-specific GUI toolkits exist for Python?
|
||||
========================================================
|
||||
|
||||
By installing the `PyObjc Objective-C bridge
|
||||
<https://pypi.org/project/pyobjc/>`_, Python programs can use Mac OS X's
|
||||
Cocoa libraries.
|
||||
|
||||
:ref:`Pythonwin <windows-faq>` by Mark Hammond includes an interface to the
|
||||
Microsoft Foundation Classes and a Python programming environment
|
||||
that's written mostly in Python using the MFC classes.
|
||||
|
||||
|
||||
Tkinter questions
|
||||
=================
|
||||
|
||||
How do I freeze Tkinter applications?
|
||||
-------------------------------------
|
||||
|
||||
Freeze is a tool to create stand-alone applications. When freezing Tkinter
|
||||
applications, the applications will not be truly stand-alone, as the application
|
||||
will still need the Tcl and Tk libraries.
|
||||
|
||||
One solution is to ship the application with the Tcl and Tk libraries, and point
|
||||
to them at run-time using the :envvar:`TCL_LIBRARY` and :envvar:`TK_LIBRARY`
|
||||
environment variables.
|
||||
|
||||
To get truly stand-alone applications, the Tcl scripts that form the library
|
||||
have to be integrated into the application as well. One tool supporting that is
|
||||
SAM (stand-alone modules), which is part of the Tix distribution
|
||||
(http://tix.sourceforge.net/).
|
||||
|
||||
Build Tix with SAM enabled, perform the appropriate call to
|
||||
:c:func:`Tclsam_init`, etc. inside Python's
|
||||
:file:`Modules/tkappinit.c`, and link with libtclsam and libtksam (you
|
||||
might include the Tix libraries as well).
|
||||
|
||||
|
||||
Can I have Tk events handled while waiting for I/O?
|
||||
---------------------------------------------------
|
||||
|
||||
On platforms other than Windows, yes, and you don't even
|
||||
need threads! But you'll have to restructure your I/O
|
||||
code a bit. Tk has the equivalent of Xt's :c:func:`XtAddInput()` call, which allows you
|
||||
to register a callback function which will be called from the Tk mainloop when
|
||||
I/O is possible on a file descriptor. See :ref:`tkinter-file-handlers`.
|
||||
|
||||
|
||||
I can't get key bindings to work in Tkinter: why?
|
||||
-------------------------------------------------
|
||||
|
||||
An often-heard complaint is that event handlers bound to events with the
|
||||
:meth:`bind` method don't get handled even when the appropriate key is pressed.
|
||||
|
||||
The most common cause is that the widget to which the binding applies doesn't
|
||||
have "keyboard focus". Check out the Tk documentation for the focus command.
|
||||
Usually a widget is given the keyboard focus by clicking in it (but not for
|
||||
labels; see the takefocus option).
|
||||
17
python-3.7.4-docs-html/_sources/faq/index.rst.txt
Normal file
17
python-3.7.4-docs-html/_sources/faq/index.rst.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
.. _faq-index:
|
||||
|
||||
###################################
|
||||
Python Frequently Asked Questions
|
||||
###################################
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
general.rst
|
||||
programming.rst
|
||||
design.rst
|
||||
library.rst
|
||||
extending.rst
|
||||
windows.rst
|
||||
gui.rst
|
||||
installed.rst
|
||||
53
python-3.7.4-docs-html/_sources/faq/installed.rst.txt
Normal file
53
python-3.7.4-docs-html/_sources/faq/installed.rst.txt
Normal file
@@ -0,0 +1,53 @@
|
||||
=============================================
|
||||
"Why is Python Installed on my Computer?" FAQ
|
||||
=============================================
|
||||
|
||||
What is Python?
|
||||
---------------
|
||||
|
||||
Python is a programming language. It's used for many different applications.
|
||||
It's used in some high schools and colleges as an introductory programming
|
||||
language because Python is easy to learn, but it's also used by professional
|
||||
software developers at places such as Google, NASA, and Lucasfilm Ltd.
|
||||
|
||||
If you wish to learn more about Python, start with the `Beginner's Guide to
|
||||
Python <https://wiki.python.org/moin/BeginnersGuide>`_.
|
||||
|
||||
|
||||
Why is Python installed on my machine?
|
||||
--------------------------------------
|
||||
|
||||
If you find Python installed on your system but don't remember installing it,
|
||||
there are several possible ways it could have gotten there.
|
||||
|
||||
* Perhaps another user on the computer wanted to learn programming and installed
|
||||
it; you'll have to figure out who's been using the machine and might have
|
||||
installed it.
|
||||
* A third-party application installed on the machine might have been written in
|
||||
Python and included a Python installation. There are many such applications,
|
||||
from GUI programs to network servers and administrative scripts.
|
||||
* Some Windows machines also have Python installed. At this writing we're aware
|
||||
of computers from Hewlett-Packard and Compaq that include Python. Apparently
|
||||
some of HP/Compaq's administrative tools are written in Python.
|
||||
* Many Unix-compatible operating systems, such as Mac OS X and some Linux
|
||||
distributions, have Python installed by default; it's included in the base
|
||||
installation.
|
||||
|
||||
|
||||
Can I delete Python?
|
||||
--------------------
|
||||
|
||||
That depends on where Python came from.
|
||||
|
||||
If someone installed it deliberately, you can remove it without hurting
|
||||
anything. On Windows, use the Add/Remove Programs icon in the Control Panel.
|
||||
|
||||
If Python was installed by a third-party application, you can also remove it,
|
||||
but that application will no longer work. You should use that application's
|
||||
uninstaller rather than removing Python directly.
|
||||
|
||||
If Python came with your operating system, removing it is not recommended. If
|
||||
you remove it, whatever tools were written in Python will no longer run, and
|
||||
some of them might be important to you. Reinstalling the whole system would
|
||||
then be required to fix things again.
|
||||
|
||||
839
python-3.7.4-docs-html/_sources/faq/library.rst.txt
Normal file
839
python-3.7.4-docs-html/_sources/faq/library.rst.txt
Normal file
@@ -0,0 +1,839 @@
|
||||
:tocdepth: 2
|
||||
|
||||
=========================
|
||||
Library and Extension FAQ
|
||||
=========================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
General Library Questions
|
||||
=========================
|
||||
|
||||
How do I find a module or application to perform task X?
|
||||
--------------------------------------------------------
|
||||
|
||||
Check :ref:`the Library Reference <library-index>` to see if there's a relevant
|
||||
standard library module. (Eventually you'll learn what's in the standard
|
||||
library and will be able to skip this step.)
|
||||
|
||||
For third-party packages, search the `Python Package Index
|
||||
<https://pypi.org>`_ or try `Google <https://www.google.com>`_ or
|
||||
another Web search engine. Searching for "Python" plus a keyword or two for
|
||||
your topic of interest will usually find something helpful.
|
||||
|
||||
|
||||
Where is the math.py (socket.py, regex.py, etc.) source file?
|
||||
-------------------------------------------------------------
|
||||
|
||||
If you can't find a source file for a module it may be a built-in or
|
||||
dynamically loaded module implemented in C, C++ or other compiled language.
|
||||
In this case you may not have the source file or it may be something like
|
||||
:file:`mathmodule.c`, somewhere in a C source directory (not on the Python Path).
|
||||
|
||||
There are (at least) three kinds of modules in Python:
|
||||
|
||||
1) modules written in Python (.py);
|
||||
2) modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc);
|
||||
3) modules written in C and linked with the interpreter; to get a list of these,
|
||||
type::
|
||||
|
||||
import sys
|
||||
print(sys.builtin_module_names)
|
||||
|
||||
|
||||
How do I make a Python script executable on Unix?
|
||||
-------------------------------------------------
|
||||
|
||||
You need to do two things: the script file's mode must be executable and the
|
||||
first line must begin with ``#!`` followed by the path of the Python
|
||||
interpreter.
|
||||
|
||||
The first is done by executing ``chmod +x scriptfile`` or perhaps ``chmod 755
|
||||
scriptfile``.
|
||||
|
||||
The second can be done in a number of ways. The most straightforward way is to
|
||||
write ::
|
||||
|
||||
#!/usr/local/bin/python
|
||||
|
||||
as the very first line of your file, using the pathname for where the Python
|
||||
interpreter is installed on your platform.
|
||||
|
||||
If you would like the script to be independent of where the Python interpreter
|
||||
lives, you can use the :program:`env` program. Almost all Unix variants support
|
||||
the following, assuming the Python interpreter is in a directory on the user's
|
||||
:envvar:`PATH`::
|
||||
|
||||
#!/usr/bin/env python
|
||||
|
||||
*Don't* do this for CGI scripts. The :envvar:`PATH` variable for CGI scripts is
|
||||
often very minimal, so you need to use the actual absolute pathname of the
|
||||
interpreter.
|
||||
|
||||
Occasionally, a user's environment is so full that the :program:`/usr/bin/env`
|
||||
program fails; or there's no env program at all. In that case, you can try the
|
||||
following hack (due to Alex Rezinsky):
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
#! /bin/sh
|
||||
""":"
|
||||
exec python $0 ${1+"$@"}
|
||||
"""
|
||||
|
||||
The minor disadvantage is that this defines the script's __doc__ string.
|
||||
However, you can fix that by adding ::
|
||||
|
||||
__doc__ = """...Whatever..."""
|
||||
|
||||
|
||||
|
||||
Is there a curses/termcap package for Python?
|
||||
---------------------------------------------
|
||||
|
||||
.. XXX curses *is* built by default, isn't it?
|
||||
|
||||
For Unix variants: The standard Python source distribution comes with a curses
|
||||
module in the :source:`Modules` subdirectory, though it's not compiled by default.
|
||||
(Note that this is not available in the Windows distribution -- there is no
|
||||
curses module for Windows.)
|
||||
|
||||
The :mod:`curses` module supports basic curses features as well as many additional
|
||||
functions from ncurses and SYSV curses such as colour, alternative character set
|
||||
support, pads, and mouse support. This means the module isn't compatible with
|
||||
operating systems that only have BSD curses, but there don't seem to be any
|
||||
currently maintained OSes that fall into this category.
|
||||
|
||||
For Windows: use `the consolelib module
|
||||
<http://effbot.org/zone/console-index.htm>`_.
|
||||
|
||||
|
||||
Is there an equivalent to C's onexit() in Python?
|
||||
-------------------------------------------------
|
||||
|
||||
The :mod:`atexit` module provides a register function that is similar to C's
|
||||
:c:func:`onexit`.
|
||||
|
||||
|
||||
Why don't my signal handlers work?
|
||||
----------------------------------
|
||||
|
||||
The most common problem is that the signal handler is declared with the wrong
|
||||
argument list. It is called as ::
|
||||
|
||||
handler(signum, frame)
|
||||
|
||||
so it should be declared with two arguments::
|
||||
|
||||
def handler(signum, frame):
|
||||
...
|
||||
|
||||
|
||||
Common tasks
|
||||
============
|
||||
|
||||
How do I test a Python program or component?
|
||||
--------------------------------------------
|
||||
|
||||
Python comes with two testing frameworks. The :mod:`doctest` module finds
|
||||
examples in the docstrings for a module and runs them, comparing the output with
|
||||
the expected output given in the docstring.
|
||||
|
||||
The :mod:`unittest` module is a fancier testing framework modelled on Java and
|
||||
Smalltalk testing frameworks.
|
||||
|
||||
To make testing easier, you should use good modular design in your program.
|
||||
Your program should have almost all functionality
|
||||
encapsulated in either functions or class methods -- and this sometimes has the
|
||||
surprising and delightful effect of making the program run faster (because local
|
||||
variable accesses are faster than global accesses). Furthermore the program
|
||||
should avoid depending on mutating global variables, since this makes testing
|
||||
much more difficult to do.
|
||||
|
||||
The "global main logic" of your program may be as simple as ::
|
||||
|
||||
if __name__ == "__main__":
|
||||
main_logic()
|
||||
|
||||
at the bottom of the main module of your program.
|
||||
|
||||
Once your program is organized as a tractable collection of functions and class
|
||||
behaviours you should write test functions that exercise the behaviours. A test
|
||||
suite that automates a sequence of tests can be associated with each module.
|
||||
This sounds like a lot of work, but since Python is so terse and flexible it's
|
||||
surprisingly easy. You can make coding much more pleasant and fun by writing
|
||||
your test functions in parallel with the "production code", since this makes it
|
||||
easy to find bugs and even design flaws earlier.
|
||||
|
||||
"Support modules" that are not intended to be the main module of a program may
|
||||
include a self-test of the module. ::
|
||||
|
||||
if __name__ == "__main__":
|
||||
self_test()
|
||||
|
||||
Even programs that interact with complex external interfaces may be tested when
|
||||
the external interfaces are unavailable by using "fake" interfaces implemented
|
||||
in Python.
|
||||
|
||||
|
||||
How do I create documentation from doc strings?
|
||||
-----------------------------------------------
|
||||
|
||||
The :mod:`pydoc` module can create HTML from the doc strings in your Python
|
||||
source code. An alternative for creating API documentation purely from
|
||||
docstrings is `epydoc <http://epydoc.sourceforge.net/>`_. `Sphinx
|
||||
<http://sphinx-doc.org>`_ can also include docstring content.
|
||||
|
||||
|
||||
How do I get a single keypress at a time?
|
||||
-----------------------------------------
|
||||
|
||||
For Unix variants there are several solutions. It's straightforward to do this
|
||||
using curses, but curses is a fairly large module to learn.
|
||||
|
||||
.. XXX this doesn't work out of the box, some IO expert needs to check why
|
||||
|
||||
Here's a solution without curses::
|
||||
|
||||
import termios, fcntl, sys, os
|
||||
fd = sys.stdin.fileno()
|
||||
|
||||
oldterm = termios.tcgetattr(fd)
|
||||
newattr = termios.tcgetattr(fd)
|
||||
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
|
||||
termios.tcsetattr(fd, termios.TCSANOW, newattr)
|
||||
|
||||
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
|
||||
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
|
||||
|
||||
try:
|
||||
while True:
|
||||
try:
|
||||
c = sys.stdin.read(1)
|
||||
print("Got character", repr(c))
|
||||
except OSError:
|
||||
pass
|
||||
finally:
|
||||
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
|
||||
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
|
||||
|
||||
You need the :mod:`termios` and the :mod:`fcntl` module for any of this to
|
||||
work, and I've only tried it on Linux, though it should work elsewhere. In
|
||||
this code, characters are read and printed one at a time.
|
||||
|
||||
:func:`termios.tcsetattr` turns off stdin's echoing and disables canonical
|
||||
mode. :func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags
|
||||
and modify them for non-blocking mode. Since reading stdin when it is empty
|
||||
results in an :exc:`OSError`, this error is caught and ignored.
|
||||
|
||||
.. versionchanged:: 3.3
|
||||
*sys.stdin.read* used to raise :exc:`IOError`. Starting from Python 3.3
|
||||
:exc:`IOError` is alias for :exc:`OSError`.
|
||||
|
||||
|
||||
Threads
|
||||
=======
|
||||
|
||||
How do I program using threads?
|
||||
-------------------------------
|
||||
|
||||
Be sure to use the :mod:`threading` module and not the :mod:`_thread` module.
|
||||
The :mod:`threading` module builds convenient abstractions on top of the
|
||||
low-level primitives provided by the :mod:`_thread` module.
|
||||
|
||||
Aahz has a set of slides from his threading tutorial that are helpful; see
|
||||
http://www.pythoncraft.com/OSCON2001/.
|
||||
|
||||
|
||||
None of my threads seem to run: why?
|
||||
------------------------------------
|
||||
|
||||
As soon as the main thread exits, all threads are killed. Your main thread is
|
||||
running too quickly, giving the threads no time to do any work.
|
||||
|
||||
A simple fix is to add a sleep to the end of the program that's long enough for
|
||||
all the threads to finish::
|
||||
|
||||
import threading, time
|
||||
|
||||
def thread_task(name, n):
|
||||
for i in range(n):
|
||||
print(name, i)
|
||||
|
||||
for i in range(10):
|
||||
T = threading.Thread(target=thread_task, args=(str(i), i))
|
||||
T.start()
|
||||
|
||||
time.sleep(10) # <---------------------------!
|
||||
|
||||
But now (on many platforms) the threads don't run in parallel, but appear to run
|
||||
sequentially, one at a time! The reason is that the OS thread scheduler doesn't
|
||||
start a new thread until the previous thread is blocked.
|
||||
|
||||
A simple fix is to add a tiny sleep to the start of the run function::
|
||||
|
||||
def thread_task(name, n):
|
||||
time.sleep(0.001) # <--------------------!
|
||||
for i in range(n):
|
||||
print(name, i)
|
||||
|
||||
for i in range(10):
|
||||
T = threading.Thread(target=thread_task, args=(str(i), i))
|
||||
T.start()
|
||||
|
||||
time.sleep(10)
|
||||
|
||||
Instead of trying to guess a good delay value for :func:`time.sleep`,
|
||||
it's better to use some kind of semaphore mechanism. One idea is to use the
|
||||
:mod:`queue` module to create a queue object, let each thread append a token to
|
||||
the queue when it finishes, and let the main thread read as many tokens from the
|
||||
queue as there are threads.
|
||||
|
||||
|
||||
How do I parcel out work among a bunch of worker threads?
|
||||
---------------------------------------------------------
|
||||
|
||||
The easiest way is to use the new :mod:`concurrent.futures` module,
|
||||
especially the :mod:`~concurrent.futures.ThreadPoolExecutor` class.
|
||||
|
||||
Or, if you want fine control over the dispatching algorithm, you can write
|
||||
your own logic manually. Use the :mod:`queue` module to create a queue
|
||||
containing a list of jobs. The :class:`~queue.Queue` class maintains a
|
||||
list of objects and has a ``.put(obj)`` method that adds items to the queue and
|
||||
a ``.get()`` method to return them. The class will take care of the locking
|
||||
necessary to ensure that each job is handed out exactly once.
|
||||
|
||||
Here's a trivial example::
|
||||
|
||||
import threading, queue, time
|
||||
|
||||
# The worker thread gets jobs off the queue. When the queue is empty, it
|
||||
# assumes there will be no more work and exits.
|
||||
# (Realistically workers will run until terminated.)
|
||||
def worker():
|
||||
print('Running worker')
|
||||
time.sleep(0.1)
|
||||
while True:
|
||||
try:
|
||||
arg = q.get(block=False)
|
||||
except queue.Empty:
|
||||
print('Worker', threading.currentThread(), end=' ')
|
||||
print('queue empty')
|
||||
break
|
||||
else:
|
||||
print('Worker', threading.currentThread(), end=' ')
|
||||
print('running with argument', arg)
|
||||
time.sleep(0.5)
|
||||
|
||||
# Create queue
|
||||
q = queue.Queue()
|
||||
|
||||
# Start a pool of 5 workers
|
||||
for i in range(5):
|
||||
t = threading.Thread(target=worker, name='worker %i' % (i+1))
|
||||
t.start()
|
||||
|
||||
# Begin adding work to the queue
|
||||
for i in range(50):
|
||||
q.put(i)
|
||||
|
||||
# Give threads time to run
|
||||
print('Main thread sleeping')
|
||||
time.sleep(5)
|
||||
|
||||
When run, this will produce the following output:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Running worker
|
||||
Main thread sleeping
|
||||
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
|
||||
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
|
||||
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
|
||||
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
|
||||
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
|
||||
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
|
||||
...
|
||||
|
||||
Consult the module's documentation for more details; the :class:`~queue.Queue`
|
||||
class provides a featureful interface.
|
||||
|
||||
|
||||
What kinds of global value mutation are thread-safe?
|
||||
----------------------------------------------------
|
||||
|
||||
A :term:`global interpreter lock` (GIL) is used internally to ensure that only one
|
||||
thread runs in the Python VM at a time. In general, Python offers to switch
|
||||
among threads only between bytecode instructions; how frequently it switches can
|
||||
be set via :func:`sys.setswitchinterval`. Each bytecode instruction and
|
||||
therefore all the C implementation code reached from each instruction is
|
||||
therefore atomic from the point of view of a Python program.
|
||||
|
||||
In theory, this means an exact accounting requires an exact understanding of the
|
||||
PVM bytecode implementation. In practice, it means that operations on shared
|
||||
variables of built-in data types (ints, lists, dicts, etc) that "look atomic"
|
||||
really are.
|
||||
|
||||
For example, the following operations are all atomic (L, L1, L2 are lists, D,
|
||||
D1, D2 are dicts, x, y are objects, i, j are ints)::
|
||||
|
||||
L.append(x)
|
||||
L1.extend(L2)
|
||||
x = L[i]
|
||||
x = L.pop()
|
||||
L1[i:j] = L2
|
||||
L.sort()
|
||||
x = y
|
||||
x.field = y
|
||||
D[x] = y
|
||||
D1.update(D2)
|
||||
D.keys()
|
||||
|
||||
These aren't::
|
||||
|
||||
i = i+1
|
||||
L.append(L[-1])
|
||||
L[i] = L[j]
|
||||
D[x] = D[x] + 1
|
||||
|
||||
Operations that replace other objects may invoke those other objects'
|
||||
:meth:`__del__` method when their reference count reaches zero, and that can
|
||||
affect things. This is especially true for the mass updates to dictionaries and
|
||||
lists. When in doubt, use a mutex!
|
||||
|
||||
|
||||
Can't we get rid of the Global Interpreter Lock?
|
||||
------------------------------------------------
|
||||
|
||||
.. XXX link to dbeazley's talk about GIL?
|
||||
|
||||
The :term:`global interpreter lock` (GIL) is often seen as a hindrance to Python's
|
||||
deployment on high-end multiprocessor server machines, because a multi-threaded
|
||||
Python program effectively only uses one CPU, due to the insistence that
|
||||
(almost) all Python code can only run while the GIL is held.
|
||||
|
||||
Back in the days of Python 1.5, Greg Stein actually implemented a comprehensive
|
||||
patch set (the "free threading" patches) that removed the GIL and replaced it
|
||||
with fine-grained locking. Adam Olsen recently did a similar experiment
|
||||
in his `python-safethread <https://code.google.com/archive/p/python-safethread>`_
|
||||
project. Unfortunately, both experiments exhibited a sharp drop in single-thread
|
||||
performance (at least 30% slower), due to the amount of fine-grained locking
|
||||
necessary to compensate for the removal of the GIL.
|
||||
|
||||
This doesn't mean that you can't make good use of Python on multi-CPU machines!
|
||||
You just have to be creative with dividing the work up between multiple
|
||||
*processes* rather than multiple *threads*. The
|
||||
:class:`~concurrent.futures.ProcessPoolExecutor` class in the new
|
||||
:mod:`concurrent.futures` module provides an easy way of doing so; the
|
||||
:mod:`multiprocessing` module provides a lower-level API in case you want
|
||||
more control over dispatching of tasks.
|
||||
|
||||
Judicious use of C extensions will also help; if you use a C extension to
|
||||
perform a time-consuming task, the extension can release the GIL while the
|
||||
thread of execution is in the C code and allow other threads to get some work
|
||||
done. Some standard library modules such as :mod:`zlib` and :mod:`hashlib`
|
||||
already do this.
|
||||
|
||||
It has been suggested that the GIL should be a per-interpreter-state lock rather
|
||||
than truly global; interpreters then wouldn't be able to share objects.
|
||||
Unfortunately, this isn't likely to happen either. It would be a tremendous
|
||||
amount of work, because many object implementations currently have global state.
|
||||
For example, small integers and short strings are cached; these caches would
|
||||
have to be moved to the interpreter state. Other object types have their own
|
||||
free list; these free lists would have to be moved to the interpreter state.
|
||||
And so on.
|
||||
|
||||
And I doubt that it can even be done in finite time, because the same problem
|
||||
exists for 3rd party extensions. It is likely that 3rd party extensions are
|
||||
being written at a faster rate than you can convert them to store all their
|
||||
global state in the interpreter state.
|
||||
|
||||
And finally, once you have multiple interpreters not sharing any state, what
|
||||
have you gained over running each interpreter in a separate process?
|
||||
|
||||
|
||||
Input and Output
|
||||
================
|
||||
|
||||
How do I delete a file? (And other file questions...)
|
||||
-----------------------------------------------------
|
||||
|
||||
Use ``os.remove(filename)`` or ``os.unlink(filename)``; for documentation, see
|
||||
the :mod:`os` module. The two functions are identical; :func:`~os.unlink` is simply
|
||||
the name of the Unix system call for this function.
|
||||
|
||||
To remove a directory, use :func:`os.rmdir`; use :func:`os.mkdir` to create one.
|
||||
``os.makedirs(path)`` will create any intermediate directories in ``path`` that
|
||||
don't exist. ``os.removedirs(path)`` will remove intermediate directories as
|
||||
long as they're empty; if you want to delete an entire directory tree and its
|
||||
contents, use :func:`shutil.rmtree`.
|
||||
|
||||
To rename a file, use ``os.rename(old_path, new_path)``.
|
||||
|
||||
To truncate a file, open it using ``f = open(filename, "rb+")``, and use
|
||||
``f.truncate(offset)``; offset defaults to the current seek position. There's
|
||||
also ``os.ftruncate(fd, offset)`` for files opened with :func:`os.open`, where
|
||||
*fd* is the file descriptor (a small integer).
|
||||
|
||||
The :mod:`shutil` module also contains a number of functions to work on files
|
||||
including :func:`~shutil.copyfile`, :func:`~shutil.copytree`, and
|
||||
:func:`~shutil.rmtree`.
|
||||
|
||||
|
||||
How do I copy a file?
|
||||
---------------------
|
||||
|
||||
The :mod:`shutil` module contains a :func:`~shutil.copyfile` function. Note
|
||||
that on MacOS 9 it doesn't copy the resource fork and Finder info.
|
||||
|
||||
|
||||
How do I read (or write) binary data?
|
||||
-------------------------------------
|
||||
|
||||
To read or write complex binary data formats, it's best to use the :mod:`struct`
|
||||
module. It allows you to take a string containing binary data (usually numbers)
|
||||
and convert it to Python objects; and vice versa.
|
||||
|
||||
For example, the following code reads two 2-byte integers and one 4-byte integer
|
||||
in big-endian format from a file::
|
||||
|
||||
import struct
|
||||
|
||||
with open(filename, "rb") as f:
|
||||
s = f.read(8)
|
||||
x, y, z = struct.unpack(">hhl", s)
|
||||
|
||||
The '>' in the format string forces big-endian data; the letter 'h' reads one
|
||||
"short integer" (2 bytes), and 'l' reads one "long integer" (4 bytes) from the
|
||||
string.
|
||||
|
||||
For data that is more regular (e.g. a homogeneous list of ints or floats),
|
||||
you can also use the :mod:`array` module.
|
||||
|
||||
.. note::
|
||||
|
||||
To read and write binary data, it is mandatory to open the file in
|
||||
binary mode (here, passing ``"rb"`` to :func:`open`). If you use
|
||||
``"r"`` instead (the default), the file will be open in text mode
|
||||
and ``f.read()`` will return :class:`str` objects rather than
|
||||
:class:`bytes` objects.
|
||||
|
||||
|
||||
I can't seem to use os.read() on a pipe created with os.popen(); why?
|
||||
---------------------------------------------------------------------
|
||||
|
||||
:func:`os.read` is a low-level function which takes a file descriptor, a small
|
||||
integer representing the opened file. :func:`os.popen` creates a high-level
|
||||
file object, the same type returned by the built-in :func:`open` function.
|
||||
Thus, to read *n* bytes from a pipe *p* created with :func:`os.popen`, you need to
|
||||
use ``p.read(n)``.
|
||||
|
||||
|
||||
.. XXX update to use subprocess. See the :ref:`subprocess-replacements` section.
|
||||
|
||||
How do I run a subprocess with pipes connected to both input and output?
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Use the :mod:`popen2` module. For example::
|
||||
|
||||
import popen2
|
||||
fromchild, tochild = popen2.popen2("command")
|
||||
tochild.write("input\n")
|
||||
tochild.flush()
|
||||
output = fromchild.readline()
|
||||
|
||||
Warning: in general it is unwise to do this because you can easily cause a
|
||||
deadlock where your process is blocked waiting for output from the child
|
||||
while the child is blocked waiting for input from you. This can be caused
|
||||
by the parent expecting the child to output more text than it does or
|
||||
by data being stuck in stdio buffers due to lack of flushing.
|
||||
The Python parent can of course explicitly flush the data it sends to the
|
||||
child before it reads any output, but if the child is a naive C program it
|
||||
may have been written to never explicitly flush its output, even if it is
|
||||
interactive, since flushing is normally automatic.
|
||||
|
||||
Note that a deadlock is also possible if you use :func:`popen3` to read
|
||||
stdout and stderr. If one of the two is too large for the internal buffer
|
||||
(increasing the buffer size does not help) and you ``read()`` the other one
|
||||
first, there is a deadlock, too.
|
||||
|
||||
Note on a bug in popen2: unless your program calls ``wait()`` or
|
||||
``waitpid()``, finished child processes are never removed, and eventually
|
||||
calls to popen2 will fail because of a limit on the number of child
|
||||
processes. Calling :func:`os.waitpid` with the :data:`os.WNOHANG` option can
|
||||
prevent this; a good place to insert such a call would be before calling
|
||||
``popen2`` again.
|
||||
|
||||
In many cases, all you really need is to run some data through a command and
|
||||
get the result back. Unless the amount of data is very large, the easiest
|
||||
way to do this is to write it to a temporary file and run the command with
|
||||
that temporary file as input. The standard module :mod:`tempfile` exports a
|
||||
:func:`~tempfile.mktemp` function to generate unique temporary file names. ::
|
||||
|
||||
import tempfile
|
||||
import os
|
||||
|
||||
class Popen3:
|
||||
"""
|
||||
This is a deadlock-safe version of popen that returns
|
||||
an object with errorlevel, out (a string) and err (a string).
|
||||
(capturestderr may not work under windows.)
|
||||
Example: print(Popen3('grep spam','\n\nhere spam\n\n').out)
|
||||
"""
|
||||
def __init__(self,command,input=None,capturestderr=None):
|
||||
outfile=tempfile.mktemp()
|
||||
command="( %s ) > %s" % (command,outfile)
|
||||
if input:
|
||||
infile=tempfile.mktemp()
|
||||
open(infile,"w").write(input)
|
||||
command=command+" <"+infile
|
||||
if capturestderr:
|
||||
errfile=tempfile.mktemp()
|
||||
command=command+" 2>"+errfile
|
||||
self.errorlevel=os.system(command) >> 8
|
||||
self.out=open(outfile,"r").read()
|
||||
os.remove(outfile)
|
||||
if input:
|
||||
os.remove(infile)
|
||||
if capturestderr:
|
||||
self.err=open(errfile,"r").read()
|
||||
os.remove(errfile)
|
||||
|
||||
Note that many interactive programs (e.g. vi) don't work well with pipes
|
||||
substituted for standard input and output. You will have to use pseudo ttys
|
||||
("ptys") instead of pipes. Or you can use a Python interface to Don Libes'
|
||||
"expect" library. A Python extension that interfaces to expect is called
|
||||
"expy" and available from http://expectpy.sourceforge.net. A pure Python
|
||||
solution that works like expect is `pexpect
|
||||
<https://pypi.org/project/pexpect/>`_.
|
||||
|
||||
|
||||
How do I access the serial (RS232) port?
|
||||
----------------------------------------
|
||||
|
||||
For Win32, POSIX (Linux, BSD, etc.), Jython:
|
||||
|
||||
http://pyserial.sourceforge.net
|
||||
|
||||
For Unix, see a Usenet post by Mitch Chapman:
|
||||
|
||||
https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com
|
||||
|
||||
|
||||
Why doesn't closing sys.stdout (stdin, stderr) really close it?
|
||||
---------------------------------------------------------------
|
||||
|
||||
Python :term:`file objects <file object>` are a high-level layer of
|
||||
abstraction on low-level C file descriptors.
|
||||
|
||||
For most file objects you create in Python via the built-in :func:`open`
|
||||
function, ``f.close()`` marks the Python file object as being closed from
|
||||
Python's point of view, and also arranges to close the underlying C file
|
||||
descriptor. This also happens automatically in ``f``'s destructor, when
|
||||
``f`` becomes garbage.
|
||||
|
||||
But stdin, stdout and stderr are treated specially by Python, because of the
|
||||
special status also given to them by C. Running ``sys.stdout.close()`` marks
|
||||
the Python-level file object as being closed, but does *not* close the
|
||||
associated C file descriptor.
|
||||
|
||||
To close the underlying C file descriptor for one of these three, you should
|
||||
first be sure that's what you really want to do (e.g., you may confuse
|
||||
extension modules trying to do I/O). If it is, use :func:`os.close`::
|
||||
|
||||
os.close(stdin.fileno())
|
||||
os.close(stdout.fileno())
|
||||
os.close(stderr.fileno())
|
||||
|
||||
Or you can use the numeric constants 0, 1 and 2, respectively.
|
||||
|
||||
|
||||
Network/Internet Programming
|
||||
============================
|
||||
|
||||
What WWW tools are there for Python?
|
||||
------------------------------------
|
||||
|
||||
See the chapters titled :ref:`internet` and :ref:`netdata` in the Library
|
||||
Reference Manual. Python has many modules that will help you build server-side
|
||||
and client-side web systems.
|
||||
|
||||
.. XXX check if wiki page is still up to date
|
||||
|
||||
A summary of available frameworks is maintained by Paul Boddie at
|
||||
https://wiki.python.org/moin/WebProgramming\ .
|
||||
|
||||
Cameron Laird maintains a useful set of pages about Python web technologies at
|
||||
http://phaseit.net/claird/comp.lang.python/web_python.
|
||||
|
||||
|
||||
How can I mimic CGI form submission (METHOD=POST)?
|
||||
--------------------------------------------------
|
||||
|
||||
I would like to retrieve web pages that are the result of POSTing a form. Is
|
||||
there existing code that would let me do this easily?
|
||||
|
||||
Yes. Here's a simple example that uses urllib.request::
|
||||
|
||||
#!/usr/local/bin/python
|
||||
|
||||
import urllib.request
|
||||
|
||||
# build the query string
|
||||
qs = "First=Josephine&MI=Q&Last=Public"
|
||||
|
||||
# connect and send the server a path
|
||||
req = urllib.request.urlopen('http://www.some-server.out-there'
|
||||
'/cgi-bin/some-cgi-script', data=qs)
|
||||
with req:
|
||||
msg, hdrs = req.read(), req.info()
|
||||
|
||||
Note that in general for percent-encoded POST operations, query strings must be
|
||||
quoted using :func:`urllib.parse.urlencode`. For example, to send
|
||||
``name=Guy Steele, Jr.``::
|
||||
|
||||
>>> import urllib.parse
|
||||
>>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'})
|
||||
'name=Guy+Steele%2C+Jr.'
|
||||
|
||||
.. seealso:: :ref:`urllib-howto` for extensive examples.
|
||||
|
||||
|
||||
What module should I use to help with generating HTML?
|
||||
------------------------------------------------------
|
||||
|
||||
.. XXX add modern template languages
|
||||
|
||||
You can find a collection of useful links on the `Web Programming wiki page
|
||||
<https://wiki.python.org/moin/WebProgramming>`_.
|
||||
|
||||
|
||||
How do I send mail from a Python script?
|
||||
----------------------------------------
|
||||
|
||||
Use the standard library module :mod:`smtplib`.
|
||||
|
||||
Here's a very simple interactive mail sender that uses it. This method will
|
||||
work on any host that supports an SMTP listener. ::
|
||||
|
||||
import sys, smtplib
|
||||
|
||||
fromaddr = input("From: ")
|
||||
toaddrs = input("To: ").split(',')
|
||||
print("Enter message, end with ^D:")
|
||||
msg = ''
|
||||
while True:
|
||||
line = sys.stdin.readline()
|
||||
if not line:
|
||||
break
|
||||
msg += line
|
||||
|
||||
# The actual mail send
|
||||
server = smtplib.SMTP('localhost')
|
||||
server.sendmail(fromaddr, toaddrs, msg)
|
||||
server.quit()
|
||||
|
||||
A Unix-only alternative uses sendmail. The location of the sendmail program
|
||||
varies between systems; sometimes it is ``/usr/lib/sendmail``, sometimes
|
||||
``/usr/sbin/sendmail``. The sendmail manual page will help you out. Here's
|
||||
some sample code::
|
||||
|
||||
import os
|
||||
|
||||
SENDMAIL = "/usr/sbin/sendmail" # sendmail location
|
||||
p = os.popen("%s -t -i" % SENDMAIL, "w")
|
||||
p.write("To: receiver@example.com\n")
|
||||
p.write("Subject: test\n")
|
||||
p.write("\n") # blank line separating headers from body
|
||||
p.write("Some text\n")
|
||||
p.write("some more text\n")
|
||||
sts = p.close()
|
||||
if sts != 0:
|
||||
print("Sendmail exit status", sts)
|
||||
|
||||
|
||||
How do I avoid blocking in the connect() method of a socket?
|
||||
------------------------------------------------------------
|
||||
|
||||
The :mod:`select` module is commonly used to help with asynchronous I/O on
|
||||
sockets.
|
||||
|
||||
To prevent the TCP connect from blocking, you can set the socket to non-blocking
|
||||
mode. Then when you do the ``connect()``, you will either connect immediately
|
||||
(unlikely) or get an exception that contains the error number as ``.errno``.
|
||||
``errno.EINPROGRESS`` indicates that the connection is in progress, but hasn't
|
||||
finished yet. Different OSes will return different values, so you're going to
|
||||
have to check what's returned on your system.
|
||||
|
||||
You can use the ``connect_ex()`` method to avoid creating an exception. It will
|
||||
just return the errno value. To poll, you can call ``connect_ex()`` again later
|
||||
-- ``0`` or ``errno.EISCONN`` indicate that you're connected -- or you can pass this
|
||||
socket to select to check if it's writable.
|
||||
|
||||
.. note::
|
||||
The :mod:`asyncore` module presents a framework-like approach to the problem
|
||||
of writing non-blocking networking code.
|
||||
The third-party `Twisted <https://twistedmatrix.com/trac/>`_ library is
|
||||
a popular and feature-rich alternative.
|
||||
|
||||
|
||||
Databases
|
||||
=========
|
||||
|
||||
Are there any interfaces to database packages in Python?
|
||||
--------------------------------------------------------
|
||||
|
||||
Yes.
|
||||
|
||||
Interfaces to disk-based hashes such as :mod:`DBM <dbm.ndbm>` and :mod:`GDBM
|
||||
<dbm.gnu>` are also included with standard Python. There is also the
|
||||
:mod:`sqlite3` module, which provides a lightweight disk-based relational
|
||||
database.
|
||||
|
||||
Support for most relational databases is available. See the
|
||||
`DatabaseProgramming wiki page
|
||||
<https://wiki.python.org/moin/DatabaseProgramming>`_ for details.
|
||||
|
||||
|
||||
How do you implement persistent objects in Python?
|
||||
--------------------------------------------------
|
||||
|
||||
The :mod:`pickle` library module solves this in a very general way (though you
|
||||
still can't store things like open files, sockets or windows), and the
|
||||
:mod:`shelve` library module uses pickle and (g)dbm to create persistent
|
||||
mappings containing arbitrary Python objects.
|
||||
|
||||
|
||||
Mathematics and Numerics
|
||||
========================
|
||||
|
||||
How do I generate random numbers in Python?
|
||||
-------------------------------------------
|
||||
|
||||
The standard module :mod:`random` implements a random number generator. Usage
|
||||
is simple::
|
||||
|
||||
import random
|
||||
random.random()
|
||||
|
||||
This returns a random floating point number in the range [0, 1).
|
||||
|
||||
There are also many other specialized generators in this module, such as:
|
||||
|
||||
* ``randrange(a, b)`` chooses an integer in the range [a, b).
|
||||
* ``uniform(a, b)`` chooses a floating point number in the range [a, b).
|
||||
* ``normalvariate(mean, sdev)`` samples the normal (Gaussian) distribution.
|
||||
|
||||
Some higher-level functions operate on sequences directly, such as:
|
||||
|
||||
* ``choice(S)`` chooses random element from a given sequence
|
||||
* ``shuffle(L)`` shuffles a list in-place, i.e. permutes it randomly
|
||||
|
||||
There's also a ``Random`` class you can instantiate to create independent
|
||||
multiple random number generators.
|
||||
1903
python-3.7.4-docs-html/_sources/faq/programming.rst.txt
Normal file
1903
python-3.7.4-docs-html/_sources/faq/programming.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
284
python-3.7.4-docs-html/_sources/faq/windows.rst.txt
Normal file
284
python-3.7.4-docs-html/_sources/faq/windows.rst.txt
Normal file
@@ -0,0 +1,284 @@
|
||||
:tocdepth: 2
|
||||
|
||||
.. highlightlang:: none
|
||||
|
||||
.. _windows-faq:
|
||||
|
||||
=====================
|
||||
Python on Windows FAQ
|
||||
=====================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. contents::
|
||||
|
||||
.. XXX need review for Python 3.
|
||||
XXX need review for Windows Vista/Seven?
|
||||
|
||||
.. _faq-run-program-under-windows:
|
||||
|
||||
|
||||
How do I run a Python program under Windows?
|
||||
--------------------------------------------
|
||||
|
||||
This is not necessarily a straightforward question. If you are already familiar
|
||||
with running programs from the Windows command line then everything will seem
|
||||
obvious; otherwise, you might need a little more guidance.
|
||||
|
||||
Unless you use some sort of integrated development environment, you will end up
|
||||
*typing* Windows commands into what is variously referred to as a "DOS window"
|
||||
or "Command prompt window". Usually you can create such a window from your
|
||||
search bar by searching for ``cmd``. You should be able to recognize
|
||||
when you have started such a window because you will see a Windows "command
|
||||
prompt", which usually looks like this:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\>
|
||||
|
||||
The letter may be different, and there might be other things after it, so you
|
||||
might just as easily see something like:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
D:\YourName\Projects\Python>
|
||||
|
||||
depending on how your computer has been set up and what else you have recently
|
||||
done with it. Once you have started such a window, you are well on the way to
|
||||
running Python programs.
|
||||
|
||||
You need to realize that your Python scripts have to be processed by another
|
||||
program called the Python *interpreter*. The interpreter reads your script,
|
||||
compiles it into bytecodes, and then executes the bytecodes to run your
|
||||
program. So, how do you arrange for the interpreter to handle your Python?
|
||||
|
||||
First, you need to make sure that your command window recognises the word
|
||||
"py" as an instruction to start the interpreter. If you have opened a
|
||||
command window, you should try entering the command ``py`` and hitting
|
||||
return:
|
||||
|
||||
.. code-block:: doscon
|
||||
|
||||
C:\Users\YourName> py
|
||||
|
||||
You should then see something like:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
|
||||
Type "help", "copyright", "credits" or "license" for more information.
|
||||
>>>
|
||||
|
||||
You have started the interpreter in "interactive mode". That means you can enter
|
||||
Python statements or expressions interactively and have them executed or
|
||||
evaluated while you wait. This is one of Python's strongest features. Check it
|
||||
by entering a few expressions of your choice and seeing the results:
|
||||
|
||||
.. code-block:: pycon
|
||||
|
||||
>>> print("Hello")
|
||||
Hello
|
||||
>>> "Hello" * 3
|
||||
'HelloHelloHello'
|
||||
|
||||
Many people use the interactive mode as a convenient yet highly programmable
|
||||
calculator. When you want to end your interactive Python session,
|
||||
call the :func:`exit` function or hold the :kbd:`Ctrl` key down
|
||||
while you enter a :kbd:`Z`, then hit the ":kbd:`Enter`" key to get
|
||||
back to your Windows command prompt.
|
||||
|
||||
You may also find that you have a Start-menu entry such as :menuselection:`Start
|
||||
--> Programs --> Python 3.x --> Python (command line)` that results in you
|
||||
seeing the ``>>>`` prompt in a new window. If so, the window will disappear
|
||||
after you call the :func:`exit` function or enter the :kbd:`Ctrl-Z`
|
||||
character; Windows is running a single "python"
|
||||
command in the window, and closes it when you terminate the interpreter.
|
||||
|
||||
Now that we know the ``py`` command is recognized, you can give your
|
||||
Python script to it. You'll have to give either an absolute or a
|
||||
relative path to the Python script. Let's say your Python script is
|
||||
located in your desktop and is named ``hello.py``, and your command
|
||||
prompt is nicely opened in your home directory so you're seeing something
|
||||
similar to::
|
||||
|
||||
C:\Users\YourName>
|
||||
|
||||
So now you'll ask the ``py`` command to give your script to Python by
|
||||
typing ``py`` followed by your script path::
|
||||
|
||||
|
||||
C:\Users\YourName> py Desktop\hello.py
|
||||
hello
|
||||
|
||||
How do I make Python scripts executable?
|
||||
----------------------------------------
|
||||
|
||||
On Windows, the standard Python installer already associates the .py
|
||||
extension with a file type (Python.File) and gives that file type an open
|
||||
command that runs the interpreter (``D:\Program Files\Python\python.exe "%1"
|
||||
%*``). This is enough to make scripts executable from the command prompt as
|
||||
'foo.py'. If you'd rather be able to execute the script by simple typing 'foo'
|
||||
with no extension you need to add .py to the PATHEXT environment variable.
|
||||
|
||||
Why does Python sometimes take so long to start?
|
||||
------------------------------------------------
|
||||
|
||||
Usually Python starts very quickly on Windows, but occasionally there are bug
|
||||
reports that Python suddenly begins to take a long time to start up. This is
|
||||
made even more puzzling because Python will work fine on other Windows systems
|
||||
which appear to be configured identically.
|
||||
|
||||
The problem may be caused by a misconfiguration of virus checking software on
|
||||
the problem machine. Some virus scanners have been known to introduce startup
|
||||
overhead of two orders of magnitude when the scanner is configured to monitor
|
||||
all reads from the filesystem. Try checking the configuration of virus scanning
|
||||
software on your systems to ensure that they are indeed configured identically.
|
||||
McAfee, when configured to scan all file system read activity, is a particular
|
||||
offender.
|
||||
|
||||
|
||||
How do I make an executable from a Python script?
|
||||
-------------------------------------------------
|
||||
|
||||
See `cx_Freeze <https://anthony-tuininga.github.io/cx_Freeze/>`_ for a distutils extension
|
||||
that allows you to create console and GUI executables from Python code.
|
||||
`py2exe <http://www.py2exe.org/>`_, the most popular extension for building
|
||||
Python 2.x-based executables, does not yet support Python 3 but a version that
|
||||
does is in development.
|
||||
|
||||
|
||||
Is a ``*.pyd`` file the same as a DLL?
|
||||
--------------------------------------
|
||||
|
||||
Yes, .pyd files are dll's, but there are a few differences. If you have a DLL
|
||||
named ``foo.pyd``, then it must have a function ``PyInit_foo()``. You can then
|
||||
write Python "import foo", and Python will search for foo.pyd (as well as
|
||||
foo.py, foo.pyc) and if it finds it, will attempt to call ``PyInit_foo()`` to
|
||||
initialize it. You do not link your .exe with foo.lib, as that would cause
|
||||
Windows to require the DLL to be present.
|
||||
|
||||
Note that the search path for foo.pyd is PYTHONPATH, not the same as the path
|
||||
that Windows uses to search for foo.dll. Also, foo.pyd need not be present to
|
||||
run your program, whereas if you linked your program with a dll, the dll is
|
||||
required. Of course, foo.pyd is required if you want to say ``import foo``. In
|
||||
a DLL, linkage is declared in the source code with ``__declspec(dllexport)``.
|
||||
In a .pyd, linkage is defined in a list of available functions.
|
||||
|
||||
|
||||
How can I embed Python into a Windows application?
|
||||
--------------------------------------------------
|
||||
|
||||
Embedding the Python interpreter in a Windows app can be summarized as follows:
|
||||
|
||||
1. Do _not_ build Python into your .exe file directly. On Windows, Python must
|
||||
be a DLL to handle importing modules that are themselves DLL's. (This is the
|
||||
first key undocumented fact.) Instead, link to :file:`python{NN}.dll`; it is
|
||||
typically installed in ``C:\Windows\System``. *NN* is the Python version, a
|
||||
number such as "33" for Python 3.3.
|
||||
|
||||
You can link to Python in two different ways. Load-time linking means
|
||||
linking against :file:`python{NN}.lib`, while run-time linking means linking
|
||||
against :file:`python{NN}.dll`. (General note: :file:`python{NN}.lib` is the
|
||||
so-called "import lib" corresponding to :file:`python{NN}.dll`. It merely
|
||||
defines symbols for the linker.)
|
||||
|
||||
Run-time linking greatly simplifies link options; everything happens at run
|
||||
time. Your code must load :file:`python{NN}.dll` using the Windows
|
||||
``LoadLibraryEx()`` routine. The code must also use access routines and data
|
||||
in :file:`python{NN}.dll` (that is, Python's C API's) using pointers obtained
|
||||
by the Windows ``GetProcAddress()`` routine. Macros can make using these
|
||||
pointers transparent to any C code that calls routines in Python's C API.
|
||||
|
||||
Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe
|
||||
first.
|
||||
|
||||
.. XXX what about static linking?
|
||||
|
||||
2. If you use SWIG, it is easy to create a Python "extension module" that will
|
||||
make the app's data and methods available to Python. SWIG will handle just
|
||||
about all the grungy details for you. The result is C code that you link
|
||||
*into* your .exe file (!) You do _not_ have to create a DLL file, and this
|
||||
also simplifies linking.
|
||||
|
||||
3. SWIG will create an init function (a C function) whose name depends on the
|
||||
name of the extension module. For example, if the name of the module is leo,
|
||||
the init function will be called initleo(). If you use SWIG shadow classes,
|
||||
as you should, the init function will be called initleoc(). This initializes
|
||||
a mostly hidden helper class used by the shadow class.
|
||||
|
||||
The reason you can link the C code in step 2 into your .exe file is that
|
||||
calling the initialization function is equivalent to importing the module
|
||||
into Python! (This is the second key undocumented fact.)
|
||||
|
||||
4. In short, you can use the following code to initialize the Python interpreter
|
||||
with your extension module.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include "python.h"
|
||||
...
|
||||
Py_Initialize(); // Initialize Python.
|
||||
initmyAppc(); // Initialize (import) the helper class.
|
||||
PyRun_SimpleString("import myApp"); // Import the shadow class.
|
||||
|
||||
5. There are two problems with Python's C API which will become apparent if you
|
||||
use a compiler other than MSVC, the compiler used to build pythonNN.dll.
|
||||
|
||||
Problem 1: The so-called "Very High Level" functions that take FILE *
|
||||
arguments will not work in a multi-compiler environment because each
|
||||
compiler's notion of a struct FILE will be different. From an implementation
|
||||
standpoint these are very _low_ level functions.
|
||||
|
||||
Problem 2: SWIG generates the following code when generating wrappers to void
|
||||
functions:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
_resultobj = Py_None;
|
||||
return _resultobj;
|
||||
|
||||
Alas, Py_None is a macro that expands to a reference to a complex data
|
||||
structure called _Py_NoneStruct inside pythonNN.dll. Again, this code will
|
||||
fail in a mult-compiler environment. Replace such code by:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
return Py_BuildValue("");
|
||||
|
||||
It may be possible to use SWIG's ``%typemap`` command to make the change
|
||||
automatically, though I have not been able to get this to work (I'm a
|
||||
complete SWIG newbie).
|
||||
|
||||
6. Using a Python shell script to put up a Python interpreter window from inside
|
||||
your Windows app is not a good idea; the resulting window will be independent
|
||||
of your app's windowing system. Rather, you (or the wxPythonWindow class)
|
||||
should create a "native" interpreter window. It is easy to connect that
|
||||
window to the Python interpreter. You can redirect Python's i/o to _any_
|
||||
object that supports read and write, so all you need is a Python object
|
||||
(defined in your extension module) that contains read() and write() methods.
|
||||
|
||||
How do I keep editors from inserting tabs into my Python source?
|
||||
----------------------------------------------------------------
|
||||
|
||||
The FAQ does not recommend using tabs, and the Python style guide, :pep:`8`,
|
||||
recommends 4 spaces for distributed Python code; this is also the Emacs
|
||||
python-mode default.
|
||||
|
||||
Under any editor, mixing tabs and spaces is a bad idea. MSVC is no different in
|
||||
this respect, and is easily configured to use spaces: Take :menuselection:`Tools
|
||||
--> Options --> Tabs`, and for file type "Default" set "Tab size" and "Indent
|
||||
size" to 4, and select the "Insert spaces" radio button.
|
||||
|
||||
Python raises :exc:`IndentationError` or :exc:`TabError` if mixed tabs
|
||||
and spaces are causing problems in leading whitespace.
|
||||
You may also run the :mod:`tabnanny` module to check a directory tree
|
||||
in batch mode.
|
||||
|
||||
|
||||
How do I check for a keypress without blocking?
|
||||
-----------------------------------------------
|
||||
|
||||
Use the msvcrt module. This is a standard Windows-specific extension module.
|
||||
It defines a function ``kbhit()`` which checks whether a keyboard hit is
|
||||
present, and ``getch()`` which gets one character without echoing it.
|
||||
1146
python-3.7.4-docs-html/_sources/glossary.rst.txt
Normal file
1146
python-3.7.4-docs-html/_sources/glossary.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
765
python-3.7.4-docs-html/_sources/howto/argparse.rst.txt
Normal file
765
python-3.7.4-docs-html/_sources/howto/argparse.rst.txt
Normal file
@@ -0,0 +1,765 @@
|
||||
*****************
|
||||
Argparse Tutorial
|
||||
*****************
|
||||
|
||||
:author: Tshepang Lekhonkhobe
|
||||
|
||||
.. _argparse-tutorial:
|
||||
|
||||
This tutorial is intended to be a gentle introduction to :mod:`argparse`, the
|
||||
recommended command-line parsing module in the Python standard library.
|
||||
|
||||
.. note::
|
||||
|
||||
There are two other modules that fulfill the same task, namely
|
||||
:mod:`getopt` (an equivalent for :c:func:`getopt` from the C
|
||||
language) and the deprecated :mod:`optparse`.
|
||||
Note also that :mod:`argparse` is based on :mod:`optparse`,
|
||||
and therefore very similar in terms of usage.
|
||||
|
||||
|
||||
Concepts
|
||||
========
|
||||
|
||||
Let's show the sort of functionality that we are going to explore in this
|
||||
introductory tutorial by making use of the :command:`ls` command:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ ls
|
||||
cpython devguide prog.py pypy rm-unused-function.patch
|
||||
$ ls pypy
|
||||
ctypes_configure demo dotviewer include lib_pypy lib-python ...
|
||||
$ ls -l
|
||||
total 20
|
||||
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
|
||||
drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide
|
||||
-rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py
|
||||
drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy
|
||||
-rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch
|
||||
$ ls --help
|
||||
Usage: ls [OPTION]... [FILE]...
|
||||
List information about the FILEs (the current directory by default).
|
||||
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
|
||||
...
|
||||
|
||||
A few concepts we can learn from the four commands:
|
||||
|
||||
* The :command:`ls` command is useful when run without any options at all. It defaults
|
||||
to displaying the contents of the current directory.
|
||||
|
||||
* If we want beyond what it provides by default, we tell it a bit more. In
|
||||
this case, we want it to display a different directory, ``pypy``.
|
||||
What we did is specify what is known as a positional argument. It's named so
|
||||
because the program should know what to do with the value, solely based on
|
||||
where it appears on the command line. This concept is more relevant
|
||||
to a command like :command:`cp`, whose most basic usage is ``cp SRC DEST``.
|
||||
The first position is *what you want copied,* and the second
|
||||
position is *where you want it copied to*.
|
||||
|
||||
* Now, say we want to change behaviour of the program. In our example,
|
||||
we display more info for each file instead of just showing the file names.
|
||||
The ``-l`` in that case is known as an optional argument.
|
||||
|
||||
* That's a snippet of the help text. It's very useful in that you can
|
||||
come across a program you have never used before, and can figure out
|
||||
how it works simply by reading its help text.
|
||||
|
||||
|
||||
The basics
|
||||
==========
|
||||
|
||||
Let us start with a very simple example which does (almost) nothing::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.parse_args()
|
||||
|
||||
Following is a result of running the code:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h]
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
$ python3 prog.py --verbose
|
||||
usage: prog.py [-h]
|
||||
prog.py: error: unrecognized arguments: --verbose
|
||||
$ python3 prog.py foo
|
||||
usage: prog.py [-h]
|
||||
prog.py: error: unrecognized arguments: foo
|
||||
|
||||
Here is what is happening:
|
||||
|
||||
* Running the script without any options results in nothing displayed to
|
||||
stdout. Not so useful.
|
||||
|
||||
* The second one starts to display the usefulness of the :mod:`argparse`
|
||||
module. We have done almost nothing, but already we get a nice help message.
|
||||
|
||||
* The ``--help`` option, which can also be shortened to ``-h``, is the only
|
||||
option we get for free (i.e. no need to specify it). Specifying anything
|
||||
else results in an error. But even then, we do get a useful usage message,
|
||||
also for free.
|
||||
|
||||
|
||||
Introducing Positional arguments
|
||||
================================
|
||||
|
||||
An example::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("echo")
|
||||
args = parser.parse_args()
|
||||
print(args.echo)
|
||||
|
||||
And running the code:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py
|
||||
usage: prog.py [-h] echo
|
||||
prog.py: error: the following arguments are required: echo
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h] echo
|
||||
|
||||
positional arguments:
|
||||
echo
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
$ python3 prog.py foo
|
||||
foo
|
||||
|
||||
Here is what's happening:
|
||||
|
||||
* We've added the :meth:`add_argument` method, which is what we use to specify
|
||||
which command-line options the program is willing to accept. In this case,
|
||||
I've named it ``echo`` so that it's in line with its function.
|
||||
|
||||
* Calling our program now requires us to specify an option.
|
||||
|
||||
* The :meth:`parse_args` method actually returns some data from the
|
||||
options specified, in this case, ``echo``.
|
||||
|
||||
* The variable is some form of 'magic' that :mod:`argparse` performs for free
|
||||
(i.e. no need to specify which variable that value is stored in).
|
||||
You will also notice that its name matches the string argument given
|
||||
to the method, ``echo``.
|
||||
|
||||
Note however that, although the help display looks nice and all, it currently
|
||||
is not as helpful as it can be. For example we see that we got ``echo`` as a
|
||||
positional argument, but we don't know what it does, other than by guessing or
|
||||
by reading the source code. So, let's make it a bit more useful::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("echo", help="echo the string you use here")
|
||||
args = parser.parse_args()
|
||||
print(args.echo)
|
||||
|
||||
And we get:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py -h
|
||||
usage: prog.py [-h] echo
|
||||
|
||||
positional arguments:
|
||||
echo echo the string you use here
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
|
||||
Now, how about doing something even more useful::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", help="display a square of a given number")
|
||||
args = parser.parse_args()
|
||||
print(args.square**2)
|
||||
|
||||
Following is a result of running the code:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4
|
||||
Traceback (most recent call last):
|
||||
File "prog.py", line 5, in <module>
|
||||
print(args.square**2)
|
||||
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
|
||||
|
||||
That didn't go so well. That's because :mod:`argparse` treats the options we
|
||||
give it as strings, unless we tell it otherwise. So, let's tell
|
||||
:mod:`argparse` to treat that input as an integer::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", help="display a square of a given number",
|
||||
type=int)
|
||||
args = parser.parse_args()
|
||||
print(args.square**2)
|
||||
|
||||
Following is a result of running the code:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4
|
||||
16
|
||||
$ python3 prog.py four
|
||||
usage: prog.py [-h] square
|
||||
prog.py: error: argument square: invalid int value: 'four'
|
||||
|
||||
That went well. The program now even helpfully quits on bad illegal input
|
||||
before proceeding.
|
||||
|
||||
|
||||
Introducing Optional arguments
|
||||
==============================
|
||||
|
||||
So far we have been playing with positional arguments. Let us
|
||||
have a look on how to add optional ones::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--verbosity", help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
if args.verbosity:
|
||||
print("verbosity turned on")
|
||||
|
||||
And the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py --verbosity 1
|
||||
verbosity turned on
|
||||
$ python3 prog.py
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h] [--verbosity VERBOSITY]
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--verbosity VERBOSITY
|
||||
increase output verbosity
|
||||
$ python3 prog.py --verbosity
|
||||
usage: prog.py [-h] [--verbosity VERBOSITY]
|
||||
prog.py: error: argument --verbosity: expected one argument
|
||||
|
||||
Here is what is happening:
|
||||
|
||||
* The program is written so as to display something when ``--verbosity`` is
|
||||
specified and display nothing when not.
|
||||
|
||||
* To show that the option is actually optional, there is no error when running
|
||||
the program without it. Note that by default, if an optional argument isn't
|
||||
used, the relevant variable, in this case :attr:`args.verbosity`, is
|
||||
given ``None`` as a value, which is the reason it fails the truth
|
||||
test of the :keyword:`if` statement.
|
||||
|
||||
* The help message is a bit different.
|
||||
|
||||
* When using the ``--verbosity`` option, one must also specify some value,
|
||||
any value.
|
||||
|
||||
The above example accepts arbitrary integer values for ``--verbosity``, but for
|
||||
our simple program, only two values are actually useful, ``True`` or ``False``.
|
||||
Let's modify the code accordingly::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--verbose", help="increase output verbosity",
|
||||
action="store_true")
|
||||
args = parser.parse_args()
|
||||
if args.verbose:
|
||||
print("verbosity turned on")
|
||||
|
||||
And the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py --verbose
|
||||
verbosity turned on
|
||||
$ python3 prog.py --verbose 1
|
||||
usage: prog.py [-h] [--verbose]
|
||||
prog.py: error: unrecognized arguments: 1
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h] [--verbose]
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
--verbose increase output verbosity
|
||||
|
||||
Here is what is happening:
|
||||
|
||||
* The option is now more of a flag than something that requires a value.
|
||||
We even changed the name of the option to match that idea.
|
||||
Note that we now specify a new keyword, ``action``, and give it the value
|
||||
``"store_true"``. This means that, if the option is specified,
|
||||
assign the value ``True`` to :data:`args.verbose`.
|
||||
Not specifying it implies ``False``.
|
||||
|
||||
* It complains when you specify a value, in true spirit of what flags
|
||||
actually are.
|
||||
|
||||
* Notice the different help text.
|
||||
|
||||
|
||||
Short options
|
||||
-------------
|
||||
|
||||
If you are familiar with command line usage,
|
||||
you will notice that I haven't yet touched on the topic of short
|
||||
versions of the options. It's quite simple::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-v", "--verbose", help="increase output verbosity",
|
||||
action="store_true")
|
||||
args = parser.parse_args()
|
||||
if args.verbose:
|
||||
print("verbosity turned on")
|
||||
|
||||
And here goes:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py -v
|
||||
verbosity turned on
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h] [-v]
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --verbose increase output verbosity
|
||||
|
||||
Note that the new ability is also reflected in the help text.
|
||||
|
||||
|
||||
Combining Positional and Optional arguments
|
||||
===========================================
|
||||
|
||||
Our program keeps growing in complexity::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display a square of a given number")
|
||||
parser.add_argument("-v", "--verbose", action="store_true",
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
if args.verbose:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
And now the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py
|
||||
usage: prog.py [-h] [-v] square
|
||||
prog.py: error: the following arguments are required: square
|
||||
$ python3 prog.py 4
|
||||
16
|
||||
$ python3 prog.py 4 --verbose
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py --verbose 4
|
||||
the square of 4 equals 16
|
||||
|
||||
* We've brought back a positional argument, hence the complaint.
|
||||
|
||||
* Note that the order does not matter.
|
||||
|
||||
How about we give this program of ours back the ability to have
|
||||
multiple verbosity values, and actually get to use them::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display a square of a given number")
|
||||
parser.add_argument("-v", "--verbosity", type=int,
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
if args.verbosity == 2:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
elif args.verbosity == 1:
|
||||
print("{}^2 == {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
And the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4
|
||||
16
|
||||
$ python3 prog.py 4 -v
|
||||
usage: prog.py [-h] [-v VERBOSITY] square
|
||||
prog.py: error: argument -v/--verbosity: expected one argument
|
||||
$ python3 prog.py 4 -v 1
|
||||
4^2 == 16
|
||||
$ python3 prog.py 4 -v 2
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py 4 -v 3
|
||||
16
|
||||
|
||||
These all look good except the last one, which exposes a bug in our program.
|
||||
Let's fix it by restricting the values the ``--verbosity`` option can accept::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display a square of a given number")
|
||||
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
if args.verbosity == 2:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
elif args.verbosity == 1:
|
||||
print("{}^2 == {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
And the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4 -v 3
|
||||
usage: prog.py [-h] [-v {0,1,2}] square
|
||||
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
|
||||
$ python3 prog.py 4 -h
|
||||
usage: prog.py [-h] [-v {0,1,2}] square
|
||||
|
||||
positional arguments:
|
||||
square display a square of a given number
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v {0,1,2}, --verbosity {0,1,2}
|
||||
increase output verbosity
|
||||
|
||||
Note that the change also reflects both in the error message as well as the
|
||||
help string.
|
||||
|
||||
Now, let's use a different approach of playing with verbosity, which is pretty
|
||||
common. It also matches the way the CPython executable handles its own
|
||||
verbosity argument (check the output of ``python --help``)::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display the square of a given number")
|
||||
parser.add_argument("-v", "--verbosity", action="count",
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
if args.verbosity == 2:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
elif args.verbosity == 1:
|
||||
print("{}^2 == {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
We have introduced another action, "count",
|
||||
to count the number of occurrences of a specific optional arguments:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4
|
||||
16
|
||||
$ python3 prog.py 4 -v
|
||||
4^2 == 16
|
||||
$ python3 prog.py 4 -vv
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py 4 --verbosity --verbosity
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py 4 -v 1
|
||||
usage: prog.py [-h] [-v] square
|
||||
prog.py: error: unrecognized arguments: 1
|
||||
$ python3 prog.py 4 -h
|
||||
usage: prog.py [-h] [-v] square
|
||||
|
||||
positional arguments:
|
||||
square display a square of a given number
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --verbosity increase output verbosity
|
||||
$ python3 prog.py 4 -vvv
|
||||
16
|
||||
|
||||
* Yes, it's now more of a flag (similar to ``action="store_true"``) in the
|
||||
previous version of our script. That should explain the complaint.
|
||||
|
||||
* It also behaves similar to "store_true" action.
|
||||
|
||||
* Now here's a demonstration of what the "count" action gives. You've probably
|
||||
seen this sort of usage before.
|
||||
|
||||
* And if you don't specify the ``-v`` flag, that flag is considered to have
|
||||
``None`` value.
|
||||
|
||||
* As should be expected, specifying the long form of the flag, we should get
|
||||
the same output.
|
||||
|
||||
* Sadly, our help output isn't very informative on the new ability our script
|
||||
has acquired, but that can always be fixed by improving the documentation for
|
||||
our script (e.g. via the ``help`` keyword argument).
|
||||
|
||||
* That last output exposes a bug in our program.
|
||||
|
||||
|
||||
Let's fix::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display a square of a given number")
|
||||
parser.add_argument("-v", "--verbosity", action="count",
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
|
||||
# bugfix: replace == with >=
|
||||
if args.verbosity >= 2:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
elif args.verbosity >= 1:
|
||||
print("{}^2 == {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
And this is what it gives:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4 -vvv
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py 4 -vvvv
|
||||
the square of 4 equals 16
|
||||
$ python3 prog.py 4
|
||||
Traceback (most recent call last):
|
||||
File "prog.py", line 11, in <module>
|
||||
if args.verbosity >= 2:
|
||||
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
|
||||
|
||||
|
||||
* First output went well, and fixes the bug we had before.
|
||||
That is, we want any value >= 2 to be as verbose as possible.
|
||||
|
||||
* Third output not so good.
|
||||
|
||||
Let's fix that bug::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("square", type=int,
|
||||
help="display a square of a given number")
|
||||
parser.add_argument("-v", "--verbosity", action="count", default=0,
|
||||
help="increase output verbosity")
|
||||
args = parser.parse_args()
|
||||
answer = args.square**2
|
||||
if args.verbosity >= 2:
|
||||
print("the square of {} equals {}".format(args.square, answer))
|
||||
elif args.verbosity >= 1:
|
||||
print("{}^2 == {}".format(args.square, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
We've just introduced yet another keyword, ``default``.
|
||||
We've set it to ``0`` in order to make it comparable to the other int values.
|
||||
Remember that by default,
|
||||
if an optional argument isn't specified,
|
||||
it gets the ``None`` value, and that cannot be compared to an int value
|
||||
(hence the :exc:`TypeError` exception).
|
||||
|
||||
And:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4
|
||||
16
|
||||
|
||||
You can go quite far just with what we've learned so far,
|
||||
and we have only scratched the surface.
|
||||
The :mod:`argparse` module is very powerful,
|
||||
and we'll explore a bit more of it before we end this tutorial.
|
||||
|
||||
|
||||
Getting a little more advanced
|
||||
==============================
|
||||
|
||||
What if we wanted to expand our tiny program to perform other powers,
|
||||
not just squares::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("x", type=int, help="the base")
|
||||
parser.add_argument("y", type=int, help="the exponent")
|
||||
parser.add_argument("-v", "--verbosity", action="count", default=0)
|
||||
args = parser.parse_args()
|
||||
answer = args.x**args.y
|
||||
if args.verbosity >= 2:
|
||||
print("{} to the power {} equals {}".format(args.x, args.y, answer))
|
||||
elif args.verbosity >= 1:
|
||||
print("{}^{} == {}".format(args.x, args.y, answer))
|
||||
else:
|
||||
print(answer)
|
||||
|
||||
Output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py
|
||||
usage: prog.py [-h] [-v] x y
|
||||
prog.py: error: the following arguments are required: x, y
|
||||
$ python3 prog.py -h
|
||||
usage: prog.py [-h] [-v] x y
|
||||
|
||||
positional arguments:
|
||||
x the base
|
||||
y the exponent
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --verbosity
|
||||
$ python3 prog.py 4 2 -v
|
||||
4^2 == 16
|
||||
|
||||
|
||||
Notice that so far we've been using verbosity level to *change* the text
|
||||
that gets displayed. The following example instead uses verbosity level
|
||||
to display *more* text instead::
|
||||
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("x", type=int, help="the base")
|
||||
parser.add_argument("y", type=int, help="the exponent")
|
||||
parser.add_argument("-v", "--verbosity", action="count", default=0)
|
||||
args = parser.parse_args()
|
||||
answer = args.x**args.y
|
||||
if args.verbosity >= 2:
|
||||
print("Running '{}'".format(__file__))
|
||||
if args.verbosity >= 1:
|
||||
print("{}^{} == ".format(args.x, args.y), end="")
|
||||
print(answer)
|
||||
|
||||
Output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4 2
|
||||
16
|
||||
$ python3 prog.py 4 2 -v
|
||||
4^2 == 16
|
||||
$ python3 prog.py 4 2 -vv
|
||||
Running 'prog.py'
|
||||
4^2 == 16
|
||||
|
||||
|
||||
Conflicting options
|
||||
-------------------
|
||||
|
||||
So far, we have been working with two methods of an
|
||||
:class:`argparse.ArgumentParser` instance. Let's introduce a third one,
|
||||
:meth:`add_mutually_exclusive_group`. It allows for us to specify options that
|
||||
conflict with each other. Let's also change the rest of the program so that
|
||||
the new functionality makes more sense:
|
||||
we'll introduce the ``--quiet`` option,
|
||||
which will be the opposite of the ``--verbose`` one::
|
||||
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
group = parser.add_mutually_exclusive_group()
|
||||
group.add_argument("-v", "--verbose", action="store_true")
|
||||
group.add_argument("-q", "--quiet", action="store_true")
|
||||
parser.add_argument("x", type=int, help="the base")
|
||||
parser.add_argument("y", type=int, help="the exponent")
|
||||
args = parser.parse_args()
|
||||
answer = args.x**args.y
|
||||
|
||||
if args.quiet:
|
||||
print(answer)
|
||||
elif args.verbose:
|
||||
print("{} to the power {} equals {}".format(args.x, args.y, answer))
|
||||
else:
|
||||
print("{}^{} == {}".format(args.x, args.y, answer))
|
||||
|
||||
Our program is now simpler, and we've lost some functionality for the sake of
|
||||
demonstration. Anyways, here's the output:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py 4 2
|
||||
4^2 == 16
|
||||
$ python3 prog.py 4 2 -q
|
||||
16
|
||||
$ python3 prog.py 4 2 -v
|
||||
4 to the power 2 equals 16
|
||||
$ python3 prog.py 4 2 -vq
|
||||
usage: prog.py [-h] [-v | -q] x y
|
||||
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
|
||||
$ python3 prog.py 4 2 -v --quiet
|
||||
usage: prog.py [-h] [-v | -q] x y
|
||||
prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
|
||||
|
||||
That should be easy to follow. I've added that last output so you can see the
|
||||
sort of flexibility you get, i.e. mixing long form options with short form
|
||||
ones.
|
||||
|
||||
Before we conclude, you probably want to tell your users the main purpose of
|
||||
your program, just in case they don't know::
|
||||
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
|
||||
group = parser.add_mutually_exclusive_group()
|
||||
group.add_argument("-v", "--verbose", action="store_true")
|
||||
group.add_argument("-q", "--quiet", action="store_true")
|
||||
parser.add_argument("x", type=int, help="the base")
|
||||
parser.add_argument("y", type=int, help="the exponent")
|
||||
args = parser.parse_args()
|
||||
answer = args.x**args.y
|
||||
|
||||
if args.quiet:
|
||||
print(answer)
|
||||
elif args.verbose:
|
||||
print("{} to the power {} equals {}".format(args.x, args.y, answer))
|
||||
else:
|
||||
print("{}^{} == {}".format(args.x, args.y, answer))
|
||||
|
||||
Note that slight difference in the usage text. Note the ``[-v | -q]``,
|
||||
which tells us that we can either use ``-v`` or ``-q``,
|
||||
but not both at the same time:
|
||||
|
||||
.. code-block:: shell-session
|
||||
|
||||
$ python3 prog.py --help
|
||||
usage: prog.py [-h] [-v | -q] x y
|
||||
|
||||
calculate X to the power of Y
|
||||
|
||||
positional arguments:
|
||||
x the base
|
||||
y the exponent
|
||||
|
||||
optional arguments:
|
||||
-h, --help show this help message and exit
|
||||
-v, --verbose
|
||||
-q, --quiet
|
||||
|
||||
|
||||
Conclusion
|
||||
==========
|
||||
|
||||
The :mod:`argparse` module offers a lot more than shown here.
|
||||
Its docs are quite detailed and thorough, and full of examples.
|
||||
Having gone through this tutorial, you should easily digest them
|
||||
without feeling overwhelmed.
|
||||
1734
python-3.7.4-docs-html/_sources/howto/clinic.rst.txt
Normal file
1734
python-3.7.4-docs-html/_sources/howto/clinic.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
257
python-3.7.4-docs-html/_sources/howto/cporting.rst.txt
Normal file
257
python-3.7.4-docs-html/_sources/howto/cporting.rst.txt
Normal file
@@ -0,0 +1,257 @@
|
||||
.. highlightlang:: c
|
||||
|
||||
.. _cporting-howto:
|
||||
|
||||
*************************************
|
||||
Porting Extension Modules to Python 3
|
||||
*************************************
|
||||
|
||||
:author: Benjamin Peterson
|
||||
|
||||
|
||||
.. topic:: Abstract
|
||||
|
||||
Although changing the C-API was not one of Python 3's objectives,
|
||||
the many Python-level changes made leaving Python 2's API intact
|
||||
impossible. In fact, some changes such as :func:`int` and
|
||||
:func:`long` unification are more obvious on the C level. This
|
||||
document endeavors to document incompatibilities and how they can
|
||||
be worked around.
|
||||
|
||||
|
||||
Conditional compilation
|
||||
=======================
|
||||
|
||||
The easiest way to compile only some code for Python 3 is to check
|
||||
if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. ::
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
#define IS_PY3K
|
||||
#endif
|
||||
|
||||
API functions that are not present can be aliased to their equivalents within
|
||||
conditional blocks.
|
||||
|
||||
|
||||
Changes to Object APIs
|
||||
======================
|
||||
|
||||
Python 3 merged together some types with similar functions while cleanly
|
||||
separating others.
|
||||
|
||||
|
||||
str/unicode Unification
|
||||
-----------------------
|
||||
|
||||
Python 3's :func:`str` type is equivalent to Python 2's :func:`unicode`; the C
|
||||
functions are called ``PyUnicode_*`` for both. The old 8-bit string type has become
|
||||
:func:`bytes`, with C functions called ``PyBytes_*``. Python 2.6 and later provide a compatibility header,
|
||||
:file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best
|
||||
compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and
|
||||
:c:type:`PyBytes` for binary data. It's also important to remember that
|
||||
:c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like
|
||||
:c:type:`PyString` and :c:type:`PyUnicode` are in Python 2. The following example
|
||||
shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`,
|
||||
and :c:type:`PyBytes`. ::
|
||||
|
||||
#include "stdlib.h"
|
||||
#include "Python.h"
|
||||
#include "bytesobject.h"
|
||||
|
||||
/* text example */
|
||||
static PyObject *
|
||||
say_hello(PyObject *self, PyObject *args) {
|
||||
PyObject *name, *result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "U:say_hello", &name))
|
||||
return NULL;
|
||||
|
||||
result = PyUnicode_FromFormat("Hello, %S!", name);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* just a forward */
|
||||
static char * do_encode(PyObject *);
|
||||
|
||||
/* bytes example */
|
||||
static PyObject *
|
||||
encode_object(PyObject *self, PyObject *args) {
|
||||
char *encoded;
|
||||
PyObject *result, *myobj;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O:encode_object", &myobj))
|
||||
return NULL;
|
||||
|
||||
encoded = do_encode(myobj);
|
||||
if (encoded == NULL)
|
||||
return NULL;
|
||||
result = PyBytes_FromString(encoded);
|
||||
free(encoded);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
long/int Unification
|
||||
--------------------
|
||||
|
||||
Python 3 has only one integer type, :func:`int`. But it actually
|
||||
corresponds to Python 2's :func:`long` type—the :func:`int` type
|
||||
used in Python 2 was removed. In the C-API, ``PyInt_*`` functions
|
||||
are replaced by their ``PyLong_*`` equivalents.
|
||||
|
||||
|
||||
Module initialization and state
|
||||
===============================
|
||||
|
||||
Python 3 has a revamped extension module initialization system. (See
|
||||
:pep:`3121`.) Instead of storing module state in globals, they should
|
||||
be stored in an interpreter specific structure. Creating modules that
|
||||
act correctly in both Python 2 and Python 3 is tricky. The following
|
||||
simple example demonstrates how. ::
|
||||
|
||||
#include "Python.h"
|
||||
|
||||
struct module_state {
|
||||
PyObject *error;
|
||||
};
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
|
||||
#else
|
||||
#define GETSTATE(m) (&_state)
|
||||
static struct module_state _state;
|
||||
#endif
|
||||
|
||||
static PyObject *
|
||||
error_out(PyObject *m) {
|
||||
struct module_state *st = GETSTATE(m);
|
||||
PyErr_SetString(st->error, "something bad happened");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static PyMethodDef myextension_methods[] = {
|
||||
{"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
|
||||
static int myextension_traverse(PyObject *m, visitproc visit, void *arg) {
|
||||
Py_VISIT(GETSTATE(m)->error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int myextension_clear(PyObject *m) {
|
||||
Py_CLEAR(GETSTATE(m)->error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct PyModuleDef moduledef = {
|
||||
PyModuleDef_HEAD_INIT,
|
||||
"myextension",
|
||||
NULL,
|
||||
sizeof(struct module_state),
|
||||
myextension_methods,
|
||||
NULL,
|
||||
myextension_traverse,
|
||||
myextension_clear,
|
||||
NULL
|
||||
};
|
||||
|
||||
#define INITERROR return NULL
|
||||
|
||||
PyMODINIT_FUNC
|
||||
PyInit_myextension(void)
|
||||
|
||||
#else
|
||||
#define INITERROR return
|
||||
|
||||
void
|
||||
initmyextension(void)
|
||||
#endif
|
||||
{
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
PyObject *module = PyModule_Create(&moduledef);
|
||||
#else
|
||||
PyObject *module = Py_InitModule("myextension", myextension_methods);
|
||||
#endif
|
||||
|
||||
if (module == NULL)
|
||||
INITERROR;
|
||||
struct module_state *st = GETSTATE(module);
|
||||
|
||||
st->error = PyErr_NewException("myextension.Error", NULL, NULL);
|
||||
if (st->error == NULL) {
|
||||
Py_DECREF(module);
|
||||
INITERROR;
|
||||
}
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
return module;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
CObject replaced with Capsule
|
||||
=============================
|
||||
|
||||
The :c:type:`Capsule` object was introduced in Python 3.1 and 2.7 to replace
|
||||
:c:type:`CObject`. CObjects were useful,
|
||||
but the :c:type:`CObject` API was problematic: it didn't permit distinguishing
|
||||
between valid CObjects, which allowed mismatched CObjects to crash the
|
||||
interpreter, and some of its APIs relied on undefined behavior in C.
|
||||
(For further reading on the rationale behind Capsules, please see :issue:`5630`.)
|
||||
|
||||
If you're currently using CObjects, and you want to migrate to 3.1 or newer,
|
||||
you'll need to switch to Capsules.
|
||||
:c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in
|
||||
Python 3.2. If you only support 2.7, or 3.1 and above, you
|
||||
can simply switch to :c:type:`Capsule`. If you need to support Python 3.0,
|
||||
or versions of Python earlier than 2.7,
|
||||
you'll have to support both CObjects and Capsules.
|
||||
(Note that Python 3.0 is no longer supported, and it is not recommended
|
||||
for production use.)
|
||||
|
||||
The following example header file :file:`capsulethunk.h` may
|
||||
solve the problem for you. Simply write your code against the
|
||||
:c:type:`Capsule` API and include this header file after
|
||||
:file:`Python.h`. Your code will automatically use Capsules
|
||||
in versions of Python with Capsules, and switch to CObjects
|
||||
when Capsules are unavailable.
|
||||
|
||||
:file:`capsulethunk.h` simulates Capsules using CObjects. However,
|
||||
:c:type:`CObject` provides no place to store the capsule's "name". As a
|
||||
result the simulated :c:type:`Capsule` objects created by :file:`capsulethunk.h`
|
||||
behave slightly differently from real Capsules. Specifically:
|
||||
|
||||
* The name parameter passed in to :c:func:`PyCapsule_New` is ignored.
|
||||
|
||||
* The name parameter passed in to :c:func:`PyCapsule_IsValid` and
|
||||
:c:func:`PyCapsule_GetPointer` is ignored, and no error checking
|
||||
of the name is performed.
|
||||
|
||||
* :c:func:`PyCapsule_GetName` always returns NULL.
|
||||
|
||||
* :c:func:`PyCapsule_SetName` always raises an exception and
|
||||
returns failure. (Since there's no way to store a name
|
||||
in a CObject, noisy failure of :c:func:`PyCapsule_SetName`
|
||||
was deemed preferable to silent failure here. If this is
|
||||
inconvenient, feel free to modify your local
|
||||
copy as you see fit.)
|
||||
|
||||
You can find :file:`capsulethunk.h` in the Python source distribution
|
||||
as :source:`Doc/includes/capsulethunk.h`. We also include it here for
|
||||
your convenience:
|
||||
|
||||
.. literalinclude:: ../includes/capsulethunk.h
|
||||
|
||||
|
||||
|
||||
Other options
|
||||
=============
|
||||
|
||||
If you are writing a new extension module, you might consider `Cython
|
||||
<http://cython.org/>`_. It translates a Python-like language to C. The
|
||||
extension modules it creates are compatible with Python 3 and Python 2.
|
||||
|
||||
552
python-3.7.4-docs-html/_sources/howto/curses.rst.txt
Normal file
552
python-3.7.4-docs-html/_sources/howto/curses.rst.txt
Normal file
@@ -0,0 +1,552 @@
|
||||
.. _curses-howto:
|
||||
|
||||
**********************************
|
||||
Curses Programming with Python
|
||||
**********************************
|
||||
|
||||
:Author: A.M. Kuchling, Eric S. Raymond
|
||||
:Release: 2.04
|
||||
|
||||
|
||||
.. topic:: Abstract
|
||||
|
||||
This document describes how to use the :mod:`curses` extension
|
||||
module to control text-mode displays.
|
||||
|
||||
|
||||
What is curses?
|
||||
===============
|
||||
|
||||
The curses library supplies a terminal-independent screen-painting and
|
||||
keyboard-handling facility for text-based terminals; such terminals
|
||||
include VT100s, the Linux console, and the simulated terminal provided
|
||||
by various programs. Display terminals support various control codes
|
||||
to perform common operations such as moving the cursor, scrolling the
|
||||
screen, and erasing areas. Different terminals use widely differing
|
||||
codes, and often have their own minor quirks.
|
||||
|
||||
In a world of graphical displays, one might ask "why bother"? It's
|
||||
true that character-cell display terminals are an obsolete technology,
|
||||
but there are niches in which being able to do fancy things with them
|
||||
are still valuable. One niche is on small-footprint or embedded
|
||||
Unixes that don't run an X server. Another is tools such as OS
|
||||
installers and kernel configurators that may have to run before any
|
||||
graphical support is available.
|
||||
|
||||
The curses library provides fairly basic functionality, providing the
|
||||
programmer with an abstraction of a display containing multiple
|
||||
non-overlapping windows of text. The contents of a window can be
|
||||
changed in various ways---adding text, erasing it, changing its
|
||||
appearance---and the curses library will figure out what control codes
|
||||
need to be sent to the terminal to produce the right output. curses
|
||||
doesn't provide many user-interface concepts such as buttons, checkboxes,
|
||||
or dialogs; if you need such features, consider a user interface library such as
|
||||
`Urwid <https://pypi.org/project/urwid/>`_.
|
||||
|
||||
The curses library was originally written for BSD Unix; the later System V
|
||||
versions of Unix from AT&T added many enhancements and new functions. BSD curses
|
||||
is no longer maintained, having been replaced by ncurses, which is an
|
||||
open-source implementation of the AT&T interface. If you're using an
|
||||
open-source Unix such as Linux or FreeBSD, your system almost certainly uses
|
||||
ncurses. Since most current commercial Unix versions are based on System V
|
||||
code, all the functions described here will probably be available. The older
|
||||
versions of curses carried by some proprietary Unixes may not support
|
||||
everything, though.
|
||||
|
||||
The Windows version of Python doesn't include the :mod:`curses`
|
||||
module. A ported version called `UniCurses
|
||||
<https://pypi.org/project/UniCurses>`_ is available. You could
|
||||
also try `the Console module <http://effbot.org/zone/console-index.htm>`_
|
||||
written by Fredrik Lundh, which doesn't
|
||||
use the same API as curses but provides cursor-addressable text output
|
||||
and full support for mouse and keyboard input.
|
||||
|
||||
|
||||
The Python curses module
|
||||
------------------------
|
||||
|
||||
The Python module is a fairly simple wrapper over the C functions provided by
|
||||
curses; if you're already familiar with curses programming in C, it's really
|
||||
easy to transfer that knowledge to Python. The biggest difference is that the
|
||||
Python interface makes things simpler by merging different C functions such as
|
||||
:c:func:`addstr`, :c:func:`mvaddstr`, and :c:func:`mvwaddstr` into a single
|
||||
:meth:`~curses.window.addstr` method. You'll see this covered in more
|
||||
detail later.
|
||||
|
||||
This HOWTO is an introduction to writing text-mode programs with curses
|
||||
and Python. It doesn't attempt to be a complete guide to the curses API; for
|
||||
that, see the Python library guide's section on ncurses, and the C manual pages
|
||||
for ncurses. It will, however, give you the basic ideas.
|
||||
|
||||
|
||||
Starting and ending a curses application
|
||||
========================================
|
||||
|
||||
Before doing anything, curses must be initialized. This is done by
|
||||
calling the :func:`~curses.initscr` function, which will determine the
|
||||
terminal type, send any required setup codes to the terminal, and
|
||||
create various internal data structures. If successful,
|
||||
:func:`initscr` returns a window object representing the entire
|
||||
screen; this is usually called ``stdscr`` after the name of the
|
||||
corresponding C variable. ::
|
||||
|
||||
import curses
|
||||
stdscr = curses.initscr()
|
||||
|
||||
Usually curses applications turn off automatic echoing of keys to the
|
||||
screen, in order to be able to read keys and only display them under
|
||||
certain circumstances. This requires calling the
|
||||
:func:`~curses.noecho` function. ::
|
||||
|
||||
curses.noecho()
|
||||
|
||||
Applications will also commonly need to react to keys instantly,
|
||||
without requiring the Enter key to be pressed; this is called cbreak
|
||||
mode, as opposed to the usual buffered input mode. ::
|
||||
|
||||
curses.cbreak()
|
||||
|
||||
Terminals usually return special keys, such as the cursor keys or navigation
|
||||
keys such as Page Up and Home, as a multibyte escape sequence. While you could
|
||||
write your application to expect such sequences and process them accordingly,
|
||||
curses can do it for you, returning a special value such as
|
||||
:const:`curses.KEY_LEFT`. To get curses to do the job, you'll have to enable
|
||||
keypad mode. ::
|
||||
|
||||
stdscr.keypad(True)
|
||||
|
||||
Terminating a curses application is much easier than starting one. You'll need
|
||||
to call::
|
||||
|
||||
curses.nocbreak()
|
||||
stdscr.keypad(False)
|
||||
curses.echo()
|
||||
|
||||
to reverse the curses-friendly terminal settings. Then call the
|
||||
:func:`~curses.endwin` function to restore the terminal to its original
|
||||
operating mode. ::
|
||||
|
||||
curses.endwin()
|
||||
|
||||
A common problem when debugging a curses application is to get your terminal
|
||||
messed up when the application dies without restoring the terminal to its
|
||||
previous state. In Python this commonly happens when your code is buggy and
|
||||
raises an uncaught exception. Keys are no longer echoed to the screen when
|
||||
you type them, for example, which makes using the shell difficult.
|
||||
|
||||
In Python you can avoid these complications and make debugging much easier by
|
||||
importing the :func:`curses.wrapper` function and using it like this::
|
||||
|
||||
from curses import wrapper
|
||||
|
||||
def main(stdscr):
|
||||
# Clear screen
|
||||
stdscr.clear()
|
||||
|
||||
# This raises ZeroDivisionError when i == 10.
|
||||
for i in range(0, 11):
|
||||
v = i-10
|
||||
stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))
|
||||
|
||||
stdscr.refresh()
|
||||
stdscr.getkey()
|
||||
|
||||
wrapper(main)
|
||||
|
||||
The :func:`~curses.wrapper` function takes a callable object and does the
|
||||
initializations described above, also initializing colors if color
|
||||
support is present. :func:`wrapper` then runs your provided callable.
|
||||
Once the callable returns, :func:`wrapper` will restore the original
|
||||
state of the terminal. The callable is called inside a
|
||||
:keyword:`try`...\ :keyword:`except` that catches exceptions, restores
|
||||
the state of the terminal, and then re-raises the exception. Therefore
|
||||
your terminal won't be left in a funny state on exception and you'll be
|
||||
able to read the exception's message and traceback.
|
||||
|
||||
|
||||
Windows and Pads
|
||||
================
|
||||
|
||||
Windows are the basic abstraction in curses. A window object represents a
|
||||
rectangular area of the screen, and supports methods to display text,
|
||||
erase it, allow the user to input strings, and so forth.
|
||||
|
||||
The ``stdscr`` object returned by the :func:`~curses.initscr` function is a
|
||||
window object that covers the entire screen. Many programs may need
|
||||
only this single window, but you might wish to divide the screen into
|
||||
smaller windows, in order to redraw or clear them separately. The
|
||||
:func:`~curses.newwin` function creates a new window of a given size,
|
||||
returning the new window object. ::
|
||||
|
||||
begin_x = 20; begin_y = 7
|
||||
height = 5; width = 40
|
||||
win = curses.newwin(height, width, begin_y, begin_x)
|
||||
|
||||
Note that the coordinate system used in curses is unusual.
|
||||
Coordinates are always passed in the order *y,x*, and the top-left
|
||||
corner of a window is coordinate (0,0). This breaks the normal
|
||||
convention for handling coordinates where the *x* coordinate comes
|
||||
first. This is an unfortunate difference from most other computer
|
||||
applications, but it's been part of curses since it was first written,
|
||||
and it's too late to change things now.
|
||||
|
||||
Your application can determine the size of the screen by using the
|
||||
:data:`curses.LINES` and :data:`curses.COLS` variables to obtain the *y* and
|
||||
*x* sizes. Legal coordinates will then extend from ``(0,0)`` to
|
||||
``(curses.LINES - 1, curses.COLS - 1)``.
|
||||
|
||||
When you call a method to display or erase text, the effect doesn't
|
||||
immediately show up on the display. Instead you must call the
|
||||
:meth:`~curses.window.refresh` method of window objects to update the
|
||||
screen.
|
||||
|
||||
This is because curses was originally written with slow 300-baud
|
||||
terminal connections in mind; with these terminals, minimizing the
|
||||
time required to redraw the screen was very important. Instead curses
|
||||
accumulates changes to the screen and displays them in the most
|
||||
efficient manner when you call :meth:`refresh`. For example, if your
|
||||
program displays some text in a window and then clears the window,
|
||||
there's no need to send the original text because they're never
|
||||
visible.
|
||||
|
||||
In practice, explicitly telling curses to redraw a window doesn't
|
||||
really complicate programming with curses much. Most programs go into a flurry
|
||||
of activity, and then pause waiting for a keypress or some other action on the
|
||||
part of the user. All you have to do is to be sure that the screen has been
|
||||
redrawn before pausing to wait for user input, by first calling
|
||||
``stdscr.refresh()`` or the :meth:`refresh` method of some other relevant
|
||||
window.
|
||||
|
||||
A pad is a special case of a window; it can be larger than the actual display
|
||||
screen, and only a portion of the pad displayed at a time. Creating a pad
|
||||
requires the pad's height and width, while refreshing a pad requires giving the
|
||||
coordinates of the on-screen area where a subsection of the pad will be
|
||||
displayed. ::
|
||||
|
||||
pad = curses.newpad(100, 100)
|
||||
# These loops fill the pad with letters; addch() is
|
||||
# explained in the next section
|
||||
for y in range(0, 99):
|
||||
for x in range(0, 99):
|
||||
pad.addch(y,x, ord('a') + (x*x+y*y) % 26)
|
||||
|
||||
# Displays a section of the pad in the middle of the screen.
|
||||
# (0,0) : coordinate of upper-left corner of pad area to display.
|
||||
# (5,5) : coordinate of upper-left corner of window area to be filled
|
||||
# with pad content.
|
||||
# (20, 75) : coordinate of lower-right corner of window area to be
|
||||
# : filled with pad content.
|
||||
pad.refresh( 0,0, 5,5, 20,75)
|
||||
|
||||
The :meth:`refresh` call displays a section of the pad in the rectangle
|
||||
extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper
|
||||
left corner of the displayed section is coordinate (0,0) on the pad. Beyond
|
||||
that difference, pads are exactly like ordinary windows and support the same
|
||||
methods.
|
||||
|
||||
If you have multiple windows and pads on screen there is a more
|
||||
efficient way to update the screen and prevent annoying screen flicker
|
||||
as each part of the screen gets updated. :meth:`refresh` actually
|
||||
does two things:
|
||||
|
||||
1) Calls the :meth:`~curses.window.noutrefresh` method of each window
|
||||
to update an underlying data structure representing the desired
|
||||
state of the screen.
|
||||
2) Calls the function :func:`~curses.doupdate` function to change the
|
||||
physical screen to match the desired state recorded in the data structure.
|
||||
|
||||
Instead you can call :meth:`noutrefresh` on a number of windows to
|
||||
update the data structure, and then call :func:`doupdate` to update
|
||||
the screen.
|
||||
|
||||
|
||||
Displaying Text
|
||||
===============
|
||||
|
||||
From a C programmer's point of view, curses may sometimes look like a
|
||||
twisty maze of functions, all subtly different. For example,
|
||||
:c:func:`addstr` displays a string at the current cursor location in
|
||||
the ``stdscr`` window, while :c:func:`mvaddstr` moves to a given y,x
|
||||
coordinate first before displaying the string. :c:func:`waddstr` is just
|
||||
like :c:func:`addstr`, but allows specifying a window to use instead of
|
||||
using ``stdscr`` by default. :c:func:`mvwaddstr` allows specifying both
|
||||
a window and a coordinate.
|
||||
|
||||
Fortunately the Python interface hides all these details. ``stdscr``
|
||||
is a window object like any other, and methods such as
|
||||
:meth:`~curses.window.addstr` accept multiple argument forms. Usually there
|
||||
are four different forms.
|
||||
|
||||
+---------------------------------+-----------------------------------------------+
|
||||
| Form | Description |
|
||||
+=================================+===============================================+
|
||||
| *str* or *ch* | Display the string *str* or character *ch* at |
|
||||
| | the current position |
|
||||
+---------------------------------+-----------------------------------------------+
|
||||
| *str* or *ch*, *attr* | Display the string *str* or character *ch*, |
|
||||
| | using attribute *attr* at the current |
|
||||
| | position |
|
||||
+---------------------------------+-----------------------------------------------+
|
||||
| *y*, *x*, *str* or *ch* | Move to position *y,x* within the window, and |
|
||||
| | display *str* or *ch* |
|
||||
+---------------------------------+-----------------------------------------------+
|
||||
| *y*, *x*, *str* or *ch*, *attr* | Move to position *y,x* within the window, and |
|
||||
| | display *str* or *ch*, using attribute *attr* |
|
||||
+---------------------------------+-----------------------------------------------+
|
||||
|
||||
Attributes allow displaying text in highlighted forms such as boldface,
|
||||
underline, reverse code, or in color. They'll be explained in more detail in
|
||||
the next subsection.
|
||||
|
||||
|
||||
The :meth:`~curses.window.addstr` method takes a Python string or
|
||||
bytestring as the value to be displayed. The contents of bytestrings
|
||||
are sent to the terminal as-is. Strings are encoded to bytes using
|
||||
the value of the window's :attr:`encoding` attribute; this defaults to
|
||||
the default system encoding as returned by
|
||||
:func:`locale.getpreferredencoding`.
|
||||
|
||||
The :meth:`~curses.window.addch` methods take a character, which can be
|
||||
either a string of length 1, a bytestring of length 1, or an integer.
|
||||
|
||||
Constants are provided for extension characters; these constants are
|
||||
integers greater than 255. For example, :const:`ACS_PLMINUS` is a +/-
|
||||
symbol, and :const:`ACS_ULCORNER` is the upper left corner of a box
|
||||
(handy for drawing borders). You can also use the appropriate Unicode
|
||||
character.
|
||||
|
||||
Windows remember where the cursor was left after the last operation, so if you
|
||||
leave out the *y,x* coordinates, the string or character will be displayed
|
||||
wherever the last operation left off. You can also move the cursor with the
|
||||
``move(y,x)`` method. Because some terminals always display a flashing cursor,
|
||||
you may want to ensure that the cursor is positioned in some location where it
|
||||
won't be distracting; it can be confusing to have the cursor blinking at some
|
||||
apparently random location.
|
||||
|
||||
If your application doesn't need a blinking cursor at all, you can
|
||||
call ``curs_set(False)`` to make it invisible. For compatibility
|
||||
with older curses versions, there's a ``leaveok(bool)`` function
|
||||
that's a synonym for :func:`~curses.curs_set`. When *bool* is true, the
|
||||
curses library will attempt to suppress the flashing cursor, and you
|
||||
won't need to worry about leaving it in odd locations.
|
||||
|
||||
|
||||
Attributes and Color
|
||||
--------------------
|
||||
|
||||
Characters can be displayed in different ways. Status lines in a text-based
|
||||
application are commonly shown in reverse video, or a text viewer may need to
|
||||
highlight certain words. curses supports this by allowing you to specify an
|
||||
attribute for each cell on the screen.
|
||||
|
||||
An attribute is an integer, each bit representing a different
|
||||
attribute. You can try to display text with multiple attribute bits
|
||||
set, but curses doesn't guarantee that all the possible combinations
|
||||
are available, or that they're all visually distinct. That depends on
|
||||
the ability of the terminal being used, so it's safest to stick to the
|
||||
most commonly available attributes, listed here.
|
||||
|
||||
+----------------------+--------------------------------------+
|
||||
| Attribute | Description |
|
||||
+======================+======================================+
|
||||
| :const:`A_BLINK` | Blinking text |
|
||||
+----------------------+--------------------------------------+
|
||||
| :const:`A_BOLD` | Extra bright or bold text |
|
||||
+----------------------+--------------------------------------+
|
||||
| :const:`A_DIM` | Half bright text |
|
||||
+----------------------+--------------------------------------+
|
||||
| :const:`A_REVERSE` | Reverse-video text |
|
||||
+----------------------+--------------------------------------+
|
||||
| :const:`A_STANDOUT` | The best highlighting mode available |
|
||||
+----------------------+--------------------------------------+
|
||||
| :const:`A_UNDERLINE` | Underlined text |
|
||||
+----------------------+--------------------------------------+
|
||||
|
||||
So, to display a reverse-video status line on the top line of the screen, you
|
||||
could code::
|
||||
|
||||
stdscr.addstr(0, 0, "Current mode: Typing mode",
|
||||
curses.A_REVERSE)
|
||||
stdscr.refresh()
|
||||
|
||||
The curses library also supports color on those terminals that provide it. The
|
||||
most common such terminal is probably the Linux console, followed by color
|
||||
xterms.
|
||||
|
||||
To use color, you must call the :func:`~curses.start_color` function soon
|
||||
after calling :func:`~curses.initscr`, to initialize the default color set
|
||||
(the :func:`curses.wrapper` function does this automatically). Once that's
|
||||
done, the :func:`~curses.has_colors` function returns TRUE if the terminal
|
||||
in use can
|
||||
actually display color. (Note: curses uses the American spelling 'color',
|
||||
instead of the Canadian/British spelling 'colour'. If you're used to the
|
||||
British spelling, you'll have to resign yourself to misspelling it for the sake
|
||||
of these functions.)
|
||||
|
||||
The curses library maintains a finite number of color pairs, containing a
|
||||
foreground (or text) color and a background color. You can get the attribute
|
||||
value corresponding to a color pair with the :func:`~curses.color_pair`
|
||||
function; this can be bitwise-OR'ed with other attributes such as
|
||||
:const:`A_REVERSE`, but again, such combinations are not guaranteed to work
|
||||
on all terminals.
|
||||
|
||||
An example, which displays a line of text using color pair 1::
|
||||
|
||||
stdscr.addstr("Pretty text", curses.color_pair(1))
|
||||
stdscr.refresh()
|
||||
|
||||
As I said before, a color pair consists of a foreground and background color.
|
||||
The ``init_pair(n, f, b)`` function changes the definition of color pair *n*, to
|
||||
foreground color f and background color b. Color pair 0 is hard-wired to white
|
||||
on black, and cannot be changed.
|
||||
|
||||
Colors are numbered, and :func:`start_color` initializes 8 basic
|
||||
colors when it activates color mode. They are: 0:black, 1:red,
|
||||
2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white. The :mod:`curses`
|
||||
module defines named constants for each of these colors:
|
||||
:const:`curses.COLOR_BLACK`, :const:`curses.COLOR_RED`, and so forth.
|
||||
|
||||
Let's put all this together. To change color 1 to red text on a white
|
||||
background, you would call::
|
||||
|
||||
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
|
||||
|
||||
When you change a color pair, any text already displayed using that color pair
|
||||
will change to the new colors. You can also display new text in this color
|
||||
with::
|
||||
|
||||
stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))
|
||||
|
||||
Very fancy terminals can change the definitions of the actual colors to a given
|
||||
RGB value. This lets you change color 1, which is usually red, to purple or
|
||||
blue or any other color you like. Unfortunately, the Linux console doesn't
|
||||
support this, so I'm unable to try it out, and can't provide any examples. You
|
||||
can check if your terminal can do this by calling
|
||||
:func:`~curses.can_change_color`, which returns ``True`` if the capability is
|
||||
there. If you're lucky enough to have such a talented terminal, consult your
|
||||
system's man pages for more information.
|
||||
|
||||
|
||||
User Input
|
||||
==========
|
||||
|
||||
The C curses library offers only very simple input mechanisms. Python's
|
||||
:mod:`curses` module adds a basic text-input widget. (Other libraries
|
||||
such as `Urwid <https://pypi.org/project/urwid/>`_ have more extensive
|
||||
collections of widgets.)
|
||||
|
||||
There are two methods for getting input from a window:
|
||||
|
||||
* :meth:`~curses.window.getch` refreshes the screen and then waits for
|
||||
the user to hit a key, displaying the key if :func:`~curses.echo` has been
|
||||
called earlier. You can optionally specify a coordinate to which
|
||||
the cursor should be moved before pausing.
|
||||
|
||||
* :meth:`~curses.window.getkey` does the same thing but converts the
|
||||
integer to a string. Individual characters are returned as
|
||||
1-character strings, and special keys such as function keys return
|
||||
longer strings containing a key name such as ``KEY_UP`` or ``^G``.
|
||||
|
||||
It's possible to not wait for the user using the
|
||||
:meth:`~curses.window.nodelay` window method. After ``nodelay(True)``,
|
||||
:meth:`getch` and :meth:`getkey` for the window become
|
||||
non-blocking. To signal that no input is ready, :meth:`getch` returns
|
||||
``curses.ERR`` (a value of -1) and :meth:`getkey` raises an exception.
|
||||
There's also a :func:`~curses.halfdelay` function, which can be used to (in
|
||||
effect) set a timer on each :meth:`getch`; if no input becomes
|
||||
available within a specified delay (measured in tenths of a second),
|
||||
curses raises an exception.
|
||||
|
||||
The :meth:`getch` method returns an integer; if it's between 0 and 255, it
|
||||
represents the ASCII code of the key pressed. Values greater than 255 are
|
||||
special keys such as Page Up, Home, or the cursor keys. You can compare the
|
||||
value returned to constants such as :const:`curses.KEY_PPAGE`,
|
||||
:const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`. The main loop of
|
||||
your program may look something like this::
|
||||
|
||||
while True:
|
||||
c = stdscr.getch()
|
||||
if c == ord('p'):
|
||||
PrintDocument()
|
||||
elif c == ord('q'):
|
||||
break # Exit the while loop
|
||||
elif c == curses.KEY_HOME:
|
||||
x = y = 0
|
||||
|
||||
The :mod:`curses.ascii` module supplies ASCII class membership functions that
|
||||
take either integer or 1-character string arguments; these may be useful in
|
||||
writing more readable tests for such loops. It also supplies
|
||||
conversion functions that take either integer or 1-character-string arguments
|
||||
and return the same type. For example, :func:`curses.ascii.ctrl` returns the
|
||||
control character corresponding to its argument.
|
||||
|
||||
There's also a method to retrieve an entire string,
|
||||
:meth:`~curses.window.getstr`. It isn't used very often, because its
|
||||
functionality is quite limited; the only editing keys available are
|
||||
the backspace key and the Enter key, which terminates the string. It
|
||||
can optionally be limited to a fixed number of characters. ::
|
||||
|
||||
curses.echo() # Enable echoing of characters
|
||||
|
||||
# Get a 15-character string, with the cursor on the top line
|
||||
s = stdscr.getstr(0,0, 15)
|
||||
|
||||
The :mod:`curses.textpad` module supplies a text box that supports an
|
||||
Emacs-like set of keybindings. Various methods of the
|
||||
:class:`~curses.textpad.Textbox` class support editing with input
|
||||
validation and gathering the edit results either with or without
|
||||
trailing spaces. Here's an example::
|
||||
|
||||
import curses
|
||||
from curses.textpad import Textbox, rectangle
|
||||
|
||||
def main(stdscr):
|
||||
stdscr.addstr(0, 0, "Enter IM message: (hit Ctrl-G to send)")
|
||||
|
||||
editwin = curses.newwin(5,30, 2,1)
|
||||
rectangle(stdscr, 1,0, 1+5+1, 1+30+1)
|
||||
stdscr.refresh()
|
||||
|
||||
box = Textbox(editwin)
|
||||
|
||||
# Let the user edit until Ctrl-G is struck.
|
||||
box.edit()
|
||||
|
||||
# Get resulting contents
|
||||
message = box.gather()
|
||||
|
||||
See the library documentation on :mod:`curses.textpad` for more details.
|
||||
|
||||
|
||||
For More Information
|
||||
====================
|
||||
|
||||
This HOWTO doesn't cover some advanced topics, such as reading the
|
||||
contents of the screen or capturing mouse events from an xterm
|
||||
instance, but the Python library page for the :mod:`curses` module is now
|
||||
reasonably complete. You should browse it next.
|
||||
|
||||
If you're in doubt about the detailed behavior of the curses
|
||||
functions, consult the manual pages for your curses implementation,
|
||||
whether it's ncurses or a proprietary Unix vendor's. The manual pages
|
||||
will document any quirks, and provide complete lists of all the
|
||||
functions, attributes, and :const:`ACS_\*` characters available to
|
||||
you.
|
||||
|
||||
Because the curses API is so large, some functions aren't supported in
|
||||
the Python interface. Often this isn't because they're difficult to
|
||||
implement, but because no one has needed them yet. Also, Python
|
||||
doesn't yet support the menu library associated with ncurses.
|
||||
Patches adding support for these would be welcome; see
|
||||
`the Python Developer's Guide <https://devguide.python.org/>`_ to
|
||||
learn more about submitting patches to Python.
|
||||
|
||||
* `Writing Programs with NCURSES <http://invisible-island.net/ncurses/ncurses-intro.html>`_:
|
||||
a lengthy tutorial for C programmers.
|
||||
* `The ncurses man page <https://linux.die.net/man/3/ncurses>`_
|
||||
* `The ncurses FAQ <http://invisible-island.net/ncurses/ncurses.faq.html>`_
|
||||
* `"Use curses... don't swear" <https://www.youtube.com/watch?v=eN1eZtjLEnU>`_:
|
||||
video of a PyCon 2013 talk on controlling terminals using curses or Urwid.
|
||||
* `"Console Applications with Urwid" <http://www.pyvideo.org/video/1568/console-applications-with-urwid>`_:
|
||||
video of a PyCon CA 2012 talk demonstrating some applications written using
|
||||
Urwid.
|
||||
443
python-3.7.4-docs-html/_sources/howto/descriptor.rst.txt
Normal file
443
python-3.7.4-docs-html/_sources/howto/descriptor.rst.txt
Normal file
@@ -0,0 +1,443 @@
|
||||
======================
|
||||
Descriptor HowTo Guide
|
||||
======================
|
||||
|
||||
:Author: Raymond Hettinger
|
||||
:Contact: <python at rcn dot com>
|
||||
|
||||
.. Contents::
|
||||
|
||||
Abstract
|
||||
--------
|
||||
|
||||
Defines descriptors, summarizes the protocol, and shows how descriptors are
|
||||
called. Examines a custom descriptor and several built-in Python descriptors
|
||||
including functions, properties, static methods, and class methods. Shows how
|
||||
each works by giving a pure Python equivalent and a sample application.
|
||||
|
||||
Learning about descriptors not only provides access to a larger toolset, it
|
||||
creates a deeper understanding of how Python works and an appreciation for the
|
||||
elegance of its design.
|
||||
|
||||
|
||||
Definition and Introduction
|
||||
---------------------------
|
||||
|
||||
In general, a descriptor is an object attribute with "binding behavior", one
|
||||
whose attribute access has been overridden by methods in the descriptor
|
||||
protocol. Those methods are :meth:`__get__`, :meth:`__set__`, and
|
||||
:meth:`__delete__`. If any of those methods are defined for an object, it is
|
||||
said to be a descriptor.
|
||||
|
||||
The default behavior for attribute access is to get, set, or delete the
|
||||
attribute from an object's dictionary. For instance, ``a.x`` has a lookup chain
|
||||
starting with ``a.__dict__['x']``, then ``type(a).__dict__['x']``, and
|
||||
continuing through the base classes of ``type(a)`` excluding metaclasses. If the
|
||||
looked-up value is an object defining one of the descriptor methods, then Python
|
||||
may override the default behavior and invoke the descriptor method instead.
|
||||
Where this occurs in the precedence chain depends on which descriptor methods
|
||||
were defined.
|
||||
|
||||
Descriptors are a powerful, general purpose protocol. They are the mechanism
|
||||
behind properties, methods, static methods, class methods, and :func:`super()`.
|
||||
They are used throughout Python itself to implement the new style classes
|
||||
introduced in version 2.2. Descriptors simplify the underlying C-code and offer
|
||||
a flexible set of new tools for everyday Python programs.
|
||||
|
||||
|
||||
Descriptor Protocol
|
||||
-------------------
|
||||
|
||||
``descr.__get__(self, obj, type=None) -> value``
|
||||
|
||||
``descr.__set__(self, obj, value) -> None``
|
||||
|
||||
``descr.__delete__(self, obj) -> None``
|
||||
|
||||
That is all there is to it. Define any of these methods and an object is
|
||||
considered a descriptor and can override default behavior upon being looked up
|
||||
as an attribute.
|
||||
|
||||
If an object defines both :meth:`__get__` and :meth:`__set__`, it is considered
|
||||
a data descriptor. Descriptors that only define :meth:`__get__` are called
|
||||
non-data descriptors (they are typically used for methods but other uses are
|
||||
possible).
|
||||
|
||||
Data and non-data descriptors differ in how overrides are calculated with
|
||||
respect to entries in an instance's dictionary. If an instance's dictionary
|
||||
has an entry with the same name as a data descriptor, the data descriptor
|
||||
takes precedence. If an instance's dictionary has an entry with the same
|
||||
name as a non-data descriptor, the dictionary entry takes precedence.
|
||||
|
||||
To make a read-only data descriptor, define both :meth:`__get__` and
|
||||
:meth:`__set__` with the :meth:`__set__` raising an :exc:`AttributeError` when
|
||||
called. Defining the :meth:`__set__` method with an exception raising
|
||||
placeholder is enough to make it a data descriptor.
|
||||
|
||||
|
||||
Invoking Descriptors
|
||||
--------------------
|
||||
|
||||
A descriptor can be called directly by its method name. For example,
|
||||
``d.__get__(obj)``.
|
||||
|
||||
Alternatively, it is more common for a descriptor to be invoked automatically
|
||||
upon attribute access. For example, ``obj.d`` looks up ``d`` in the dictionary
|
||||
of ``obj``. If ``d`` defines the method :meth:`__get__`, then ``d.__get__(obj)``
|
||||
is invoked according to the precedence rules listed below.
|
||||
|
||||
The details of invocation depend on whether ``obj`` is an object or a class.
|
||||
|
||||
For objects, the machinery is in :meth:`object.__getattribute__` which
|
||||
transforms ``b.x`` into ``type(b).__dict__['x'].__get__(b, type(b))``. The
|
||||
implementation works through a precedence chain that gives data descriptors
|
||||
priority over instance variables, instance variables priority over non-data
|
||||
descriptors, and assigns lowest priority to :meth:`__getattr__` if provided.
|
||||
The full C implementation can be found in :c:func:`PyObject_GenericGetAttr()` in
|
||||
:source:`Objects/object.c`.
|
||||
|
||||
For classes, the machinery is in :meth:`type.__getattribute__` which transforms
|
||||
``B.x`` into ``B.__dict__['x'].__get__(None, B)``. In pure Python, it looks
|
||||
like::
|
||||
|
||||
def __getattribute__(self, key):
|
||||
"Emulate type_getattro() in Objects/typeobject.c"
|
||||
v = object.__getattribute__(self, key)
|
||||
if hasattr(v, '__get__'):
|
||||
return v.__get__(None, self)
|
||||
return v
|
||||
|
||||
The important points to remember are:
|
||||
|
||||
* descriptors are invoked by the :meth:`__getattribute__` method
|
||||
* overriding :meth:`__getattribute__` prevents automatic descriptor calls
|
||||
* :meth:`object.__getattribute__` and :meth:`type.__getattribute__` make
|
||||
different calls to :meth:`__get__`.
|
||||
* data descriptors always override instance dictionaries.
|
||||
* non-data descriptors may be overridden by instance dictionaries.
|
||||
|
||||
The object returned by ``super()`` also has a custom :meth:`__getattribute__`
|
||||
method for invoking descriptors. The call ``super(B, obj).m()`` searches
|
||||
``obj.__class__.__mro__`` for the base class ``A`` immediately following ``B``
|
||||
and then returns ``A.__dict__['m'].__get__(obj, B)``. If not a descriptor,
|
||||
``m`` is returned unchanged. If not in the dictionary, ``m`` reverts to a
|
||||
search using :meth:`object.__getattribute__`.
|
||||
|
||||
The implementation details are in :c:func:`super_getattro()` in
|
||||
:source:`Objects/typeobject.c`. and a pure Python equivalent can be found in
|
||||
`Guido's Tutorial`_.
|
||||
|
||||
.. _`Guido's Tutorial`: https://www.python.org/download/releases/2.2.3/descrintro/#cooperation
|
||||
|
||||
The details above show that the mechanism for descriptors is embedded in the
|
||||
:meth:`__getattribute__()` methods for :class:`object`, :class:`type`, and
|
||||
:func:`super`. Classes inherit this machinery when they derive from
|
||||
:class:`object` or if they have a meta-class providing similar functionality.
|
||||
Likewise, classes can turn-off descriptor invocation by overriding
|
||||
:meth:`__getattribute__()`.
|
||||
|
||||
|
||||
Descriptor Example
|
||||
------------------
|
||||
|
||||
The following code creates a class whose objects are data descriptors which
|
||||
print a message for each get or set. Overriding :meth:`__getattribute__` is
|
||||
alternate approach that could do this for every attribute. However, this
|
||||
descriptor is useful for monitoring just a few chosen attributes::
|
||||
|
||||
class RevealAccess(object):
|
||||
"""A data descriptor that sets and returns values
|
||||
normally and prints a message logging their access.
|
||||
"""
|
||||
|
||||
def __init__(self, initval=None, name='var'):
|
||||
self.val = initval
|
||||
self.name = name
|
||||
|
||||
def __get__(self, obj, objtype):
|
||||
print('Retrieving', self.name)
|
||||
return self.val
|
||||
|
||||
def __set__(self, obj, val):
|
||||
print('Updating', self.name)
|
||||
self.val = val
|
||||
|
||||
>>> class MyClass(object):
|
||||
... x = RevealAccess(10, 'var "x"')
|
||||
... y = 5
|
||||
...
|
||||
>>> m = MyClass()
|
||||
>>> m.x
|
||||
Retrieving var "x"
|
||||
10
|
||||
>>> m.x = 20
|
||||
Updating var "x"
|
||||
>>> m.x
|
||||
Retrieving var "x"
|
||||
20
|
||||
>>> m.y
|
||||
5
|
||||
|
||||
The protocol is simple and offers exciting possibilities. Several use cases are
|
||||
so common that they have been packaged into individual function calls.
|
||||
Properties, bound methods, static methods, and class methods are all
|
||||
based on the descriptor protocol.
|
||||
|
||||
|
||||
Properties
|
||||
----------
|
||||
|
||||
Calling :func:`property` is a succinct way of building a data descriptor that
|
||||
triggers function calls upon access to an attribute. Its signature is::
|
||||
|
||||
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
|
||||
|
||||
The documentation shows a typical use to define a managed attribute ``x``::
|
||||
|
||||
class C(object):
|
||||
def getx(self): return self.__x
|
||||
def setx(self, value): self.__x = value
|
||||
def delx(self): del self.__x
|
||||
x = property(getx, setx, delx, "I'm the 'x' property.")
|
||||
|
||||
To see how :func:`property` is implemented in terms of the descriptor protocol,
|
||||
here is a pure Python equivalent::
|
||||
|
||||
class Property(object):
|
||||
"Emulate PyProperty_Type() in Objects/descrobject.c"
|
||||
|
||||
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
|
||||
self.fget = fget
|
||||
self.fset = fset
|
||||
self.fdel = fdel
|
||||
if doc is None and fget is not None:
|
||||
doc = fget.__doc__
|
||||
self.__doc__ = doc
|
||||
|
||||
def __get__(self, obj, objtype=None):
|
||||
if obj is None:
|
||||
return self
|
||||
if self.fget is None:
|
||||
raise AttributeError("unreadable attribute")
|
||||
return self.fget(obj)
|
||||
|
||||
def __set__(self, obj, value):
|
||||
if self.fset is None:
|
||||
raise AttributeError("can't set attribute")
|
||||
self.fset(obj, value)
|
||||
|
||||
def __delete__(self, obj):
|
||||
if self.fdel is None:
|
||||
raise AttributeError("can't delete attribute")
|
||||
self.fdel(obj)
|
||||
|
||||
def getter(self, fget):
|
||||
return type(self)(fget, self.fset, self.fdel, self.__doc__)
|
||||
|
||||
def setter(self, fset):
|
||||
return type(self)(self.fget, fset, self.fdel, self.__doc__)
|
||||
|
||||
def deleter(self, fdel):
|
||||
return type(self)(self.fget, self.fset, fdel, self.__doc__)
|
||||
|
||||
The :func:`property` builtin helps whenever a user interface has granted
|
||||
attribute access and then subsequent changes require the intervention of a
|
||||
method.
|
||||
|
||||
For instance, a spreadsheet class may grant access to a cell value through
|
||||
``Cell('b10').value``. Subsequent improvements to the program require the cell
|
||||
to be recalculated on every access; however, the programmer does not want to
|
||||
affect existing client code accessing the attribute directly. The solution is
|
||||
to wrap access to the value attribute in a property data descriptor::
|
||||
|
||||
class Cell(object):
|
||||
. . .
|
||||
def getvalue(self):
|
||||
"Recalculate the cell before returning value"
|
||||
self.recalc()
|
||||
return self._value
|
||||
value = property(getvalue)
|
||||
|
||||
|
||||
Functions and Methods
|
||||
---------------------
|
||||
|
||||
Python's object oriented features are built upon a function based environment.
|
||||
Using non-data descriptors, the two are merged seamlessly.
|
||||
|
||||
Class dictionaries store methods as functions. In a class definition, methods
|
||||
are written using :keyword:`def` or :keyword:`lambda`, the usual tools for
|
||||
creating functions. Methods only differ from regular functions in that the
|
||||
first argument is reserved for the object instance. By Python convention, the
|
||||
instance reference is called *self* but may be called *this* or any other
|
||||
variable name.
|
||||
|
||||
To support method calls, functions include the :meth:`__get__` method for
|
||||
binding methods during attribute access. This means that all functions are
|
||||
non-data descriptors which return bound methods when they are invoked from an
|
||||
object. In pure Python, it works like this::
|
||||
|
||||
class Function(object):
|
||||
. . .
|
||||
def __get__(self, obj, objtype=None):
|
||||
"Simulate func_descr_get() in Objects/funcobject.c"
|
||||
if obj is None:
|
||||
return self
|
||||
return types.MethodType(self, obj)
|
||||
|
||||
Running the interpreter shows how the function descriptor works in practice::
|
||||
|
||||
>>> class D(object):
|
||||
... def f(self, x):
|
||||
... return x
|
||||
...
|
||||
>>> d = D()
|
||||
|
||||
# Access through the class dictionary does not invoke __get__.
|
||||
# It just returns the underlying function object.
|
||||
>>> D.__dict__['f']
|
||||
<function D.f at 0x00C45070>
|
||||
|
||||
# Dotted access from a class calls __get__() which just returns
|
||||
# the underlying function unchanged.
|
||||
>>> D.f
|
||||
<function D.f at 0x00C45070>
|
||||
|
||||
# The function has a __qualname__ attribute to support introspection
|
||||
>>> D.f.__qualname__
|
||||
'D.f'
|
||||
|
||||
# Dotted access from an instance calls __get__() which returns the
|
||||
# function wrapped in a bound method object
|
||||
>>> d.f
|
||||
<bound method D.f of <__main__.D object at 0x00B18C90>>
|
||||
|
||||
# Internally, the bound method stores the underlying function,
|
||||
# the bound instance, and the class of the bound instance.
|
||||
>>> d.f.__func__
|
||||
<function D.f at 0x1012e5ae8>
|
||||
>>> d.f.__self__
|
||||
<__main__.D object at 0x1012e1f98>
|
||||
>>> d.f.__class__
|
||||
<class 'method'>
|
||||
|
||||
|
||||
Static Methods and Class Methods
|
||||
--------------------------------
|
||||
|
||||
Non-data descriptors provide a simple mechanism for variations on the usual
|
||||
patterns of binding functions into methods.
|
||||
|
||||
To recap, functions have a :meth:`__get__` method so that they can be converted
|
||||
to a method when accessed as attributes. The non-data descriptor transforms an
|
||||
``obj.f(*args)`` call into ``f(obj, *args)``. Calling ``klass.f(*args)``
|
||||
becomes ``f(*args)``.
|
||||
|
||||
This chart summarizes the binding and its two most useful variants:
|
||||
|
||||
+-----------------+----------------------+------------------+
|
||||
| Transformation | Called from an | Called from a |
|
||||
| | Object | Class |
|
||||
+=================+======================+==================+
|
||||
| function | f(obj, \*args) | f(\*args) |
|
||||
+-----------------+----------------------+------------------+
|
||||
| staticmethod | f(\*args) | f(\*args) |
|
||||
+-----------------+----------------------+------------------+
|
||||
| classmethod | f(type(obj), \*args) | f(klass, \*args) |
|
||||
+-----------------+----------------------+------------------+
|
||||
|
||||
Static methods return the underlying function without changes. Calling either
|
||||
``c.f`` or ``C.f`` is the equivalent of a direct lookup into
|
||||
``object.__getattribute__(c, "f")`` or ``object.__getattribute__(C, "f")``. As a
|
||||
result, the function becomes identically accessible from either an object or a
|
||||
class.
|
||||
|
||||
Good candidates for static methods are methods that do not reference the
|
||||
``self`` variable.
|
||||
|
||||
For instance, a statistics package may include a container class for
|
||||
experimental data. The class provides normal methods for computing the average,
|
||||
mean, median, and other descriptive statistics that depend on the data. However,
|
||||
there may be useful functions which are conceptually related but do not depend
|
||||
on the data. For instance, ``erf(x)`` is handy conversion routine that comes up
|
||||
in statistical work but does not directly depend on a particular dataset.
|
||||
It can be called either from an object or the class: ``s.erf(1.5) --> .9332`` or
|
||||
``Sample.erf(1.5) --> .9332``.
|
||||
|
||||
Since staticmethods return the underlying function with no changes, the example
|
||||
calls are unexciting::
|
||||
|
||||
>>> class E(object):
|
||||
... def f(x):
|
||||
... print(x)
|
||||
... f = staticmethod(f)
|
||||
...
|
||||
>>> E.f(3)
|
||||
3
|
||||
>>> E().f(3)
|
||||
3
|
||||
|
||||
Using the non-data descriptor protocol, a pure Python version of
|
||||
:func:`staticmethod` would look like this::
|
||||
|
||||
class StaticMethod(object):
|
||||
"Emulate PyStaticMethod_Type() in Objects/funcobject.c"
|
||||
|
||||
def __init__(self, f):
|
||||
self.f = f
|
||||
|
||||
def __get__(self, obj, objtype=None):
|
||||
return self.f
|
||||
|
||||
Unlike static methods, class methods prepend the class reference to the
|
||||
argument list before calling the function. This format is the same
|
||||
for whether the caller is an object or a class::
|
||||
|
||||
>>> class E(object):
|
||||
... def f(klass, x):
|
||||
... return klass.__name__, x
|
||||
... f = classmethod(f)
|
||||
...
|
||||
>>> print(E.f(3))
|
||||
('E', 3)
|
||||
>>> print(E().f(3))
|
||||
('E', 3)
|
||||
|
||||
|
||||
This behavior is useful whenever the function only needs to have a class
|
||||
reference and does not care about any underlying data. One use for classmethods
|
||||
is to create alternate class constructors. In Python 2.3, the classmethod
|
||||
:func:`dict.fromkeys` creates a new dictionary from a list of keys. The pure
|
||||
Python equivalent is::
|
||||
|
||||
class Dict(object):
|
||||
. . .
|
||||
def fromkeys(klass, iterable, value=None):
|
||||
"Emulate dict_fromkeys() in Objects/dictobject.c"
|
||||
d = klass()
|
||||
for key in iterable:
|
||||
d[key] = value
|
||||
return d
|
||||
fromkeys = classmethod(fromkeys)
|
||||
|
||||
Now a new dictionary of unique keys can be constructed like this::
|
||||
|
||||
>>> Dict.fromkeys('abracadabra')
|
||||
{'a': None, 'r': None, 'b': None, 'c': None, 'd': None}
|
||||
|
||||
Using the non-data descriptor protocol, a pure Python version of
|
||||
:func:`classmethod` would look like this::
|
||||
|
||||
class ClassMethod(object):
|
||||
"Emulate PyClassMethod_Type() in Objects/funcobject.c"
|
||||
|
||||
def __init__(self, f):
|
||||
self.f = f
|
||||
|
||||
def __get__(self, obj, klass=None):
|
||||
if klass is None:
|
||||
klass = type(obj)
|
||||
def newfunc(*args):
|
||||
return self.f(klass, *args)
|
||||
return newfunc
|
||||
|
||||
1262
python-3.7.4-docs-html/_sources/howto/functional.rst.txt
Normal file
1262
python-3.7.4-docs-html/_sources/howto/functional.rst.txt
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user