mirror of https://github.com/pybind/pybind11
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
8.8 KiB
286 lines
8.8 KiB
Python types |
|
############ |
|
|
|
.. _wrappers: |
|
|
|
Available wrappers |
|
================== |
|
|
|
All major Python types are available as thin C++ wrapper classes. These |
|
can also be used as function parameters -- see :ref:`python_objects_as_args`. |
|
|
|
Available types include :class:`handle`, :class:`object`, :class:`bool_`, |
|
:class:`int_`, :class:`float_`, :class:`str`, :class:`bytes`, :class:`tuple`, |
|
:class:`list`, :class:`dict`, :class:`slice`, :class:`none`, :class:`capsule`, |
|
:class:`iterable`, :class:`iterator`, :class:`function`, :class:`buffer`, |
|
:class:`array`, and :class:`array_t`. |
|
|
|
.. warning:: |
|
|
|
Be sure to review the :ref:`pytypes_gotchas` before using this heavily in |
|
your C++ API. |
|
|
|
.. _instantiating_compound_types: |
|
|
|
Instantiating compound Python types from C++ |
|
============================================ |
|
|
|
Dictionaries can be initialized in the :class:`dict` constructor: |
|
|
|
.. code-block:: cpp |
|
|
|
using namespace pybind11::literals; // to bring in the `_a` literal |
|
py::dict d("spam"_a=py::none(), "eggs"_a=42); |
|
|
|
A tuple of python objects can be instantiated using :func:`py::make_tuple`: |
|
|
|
.. code-block:: cpp |
|
|
|
py::tuple tup = py::make_tuple(42, py::none(), "spam"); |
|
|
|
Each element is converted to a supported Python type. |
|
|
|
A `simple namespace`_ can be instantiated using |
|
|
|
.. code-block:: cpp |
|
|
|
using namespace pybind11::literals; // to bring in the `_a` literal |
|
py::object SimpleNamespace = py::module_::import("types").attr("SimpleNamespace"); |
|
py::object ns = SimpleNamespace("spam"_a=py::none(), "eggs"_a=42); |
|
|
|
Attributes on a namespace can be modified with the :func:`py::delattr`, |
|
:func:`py::getattr`, and :func:`py::setattr` functions. Simple namespaces can |
|
be useful as lightweight stand-ins for class instances. |
|
|
|
.. _simple namespace: https://docs.python.org/3/library/types.html#types.SimpleNamespace |
|
|
|
.. _casting_back_and_forth: |
|
|
|
Casting back and forth |
|
====================== |
|
|
|
In this kind of mixed code, it is often necessary to convert arbitrary C++ |
|
types to Python, which can be done using :func:`py::cast`: |
|
|
|
.. code-block:: cpp |
|
|
|
MyClass *cls = ...; |
|
py::object obj = py::cast(cls); |
|
|
|
The reverse direction uses the following syntax: |
|
|
|
.. code-block:: cpp |
|
|
|
py::object obj = ...; |
|
MyClass *cls = obj.cast<MyClass *>(); |
|
|
|
When conversion fails, both directions throw the exception :class:`cast_error`. |
|
|
|
.. _python_libs: |
|
|
|
Accessing Python libraries from C++ |
|
=================================== |
|
|
|
It is also possible to import objects defined in the Python standard |
|
library or available in the current Python environment (``sys.path``) and work |
|
with these in C++. |
|
|
|
This example obtains a reference to the Python ``Decimal`` class. |
|
|
|
.. code-block:: cpp |
|
|
|
// Equivalent to "from decimal import Decimal" |
|
py::object Decimal = py::module_::import("decimal").attr("Decimal"); |
|
|
|
.. code-block:: cpp |
|
|
|
// Try to import scipy |
|
py::object scipy = py::module_::import("scipy"); |
|
return scipy.attr("__version__"); |
|
|
|
|
|
.. _calling_python_functions: |
|
|
|
Calling Python functions |
|
======================== |
|
|
|
It is also possible to call Python classes, functions and methods |
|
via ``operator()``. |
|
|
|
.. code-block:: cpp |
|
|
|
// Construct a Python object of class Decimal |
|
py::object pi = Decimal("3.14159"); |
|
|
|
.. code-block:: cpp |
|
|
|
// Use Python to make our directories |
|
py::object os = py::module_::import("os"); |
|
py::object makedirs = os.attr("makedirs"); |
|
makedirs("/tmp/path/to/somewhere"); |
|
|
|
One can convert the result obtained from Python to a pure C++ version |
|
if a ``py::class_`` or type conversion is defined. |
|
|
|
.. code-block:: cpp |
|
|
|
py::function f = <...>; |
|
py::object result_py = f(1234, "hello", some_instance); |
|
MyClass &result = result_py.cast<MyClass>(); |
|
|
|
.. _calling_python_methods: |
|
|
|
Calling Python methods |
|
======================== |
|
|
|
To call an object's method, one can again use ``.attr`` to obtain access to the |
|
Python method. |
|
|
|
.. code-block:: cpp |
|
|
|
// Calculate e^π in decimal |
|
py::object exp_pi = pi.attr("exp")(); |
|
py::print(py::str(exp_pi)); |
|
|
|
In the example above ``pi.attr("exp")`` is a *bound method*: it will always call |
|
the method for that same instance of the class. Alternately one can create an |
|
*unbound method* via the Python class (instead of instance) and pass the ``self`` |
|
object explicitly, followed by other arguments. |
|
|
|
.. code-block:: cpp |
|
|
|
py::object decimal_exp = Decimal.attr("exp"); |
|
|
|
// Compute the e^n for n=0..4 |
|
for (int n = 0; n < 5; n++) { |
|
py::print(decimal_exp(Decimal(n)); |
|
} |
|
|
|
Keyword arguments |
|
================= |
|
|
|
Keyword arguments are also supported. In Python, there is the usual call syntax: |
|
|
|
.. code-block:: python |
|
|
|
def f(number, say, to): |
|
... # function code |
|
|
|
|
|
f(1234, say="hello", to=some_instance) # keyword call in Python |
|
|
|
In C++, the same call can be made using: |
|
|
|
.. code-block:: cpp |
|
|
|
using namespace pybind11::literals; // to bring in the `_a` literal |
|
f(1234, "say"_a="hello", "to"_a=some_instance); // keyword call in C++ |
|
|
|
Unpacking arguments |
|
=================== |
|
|
|
Unpacking of ``*args`` and ``**kwargs`` is also possible and can be mixed with |
|
other arguments: |
|
|
|
.. code-block:: cpp |
|
|
|
// * unpacking |
|
py::tuple args = py::make_tuple(1234, "hello", some_instance); |
|
f(*args); |
|
|
|
// ** unpacking |
|
py::dict kwargs = py::dict("number"_a=1234, "say"_a="hello", "to"_a=some_instance); |
|
f(**kwargs); |
|
|
|
// mixed keywords, * and ** unpacking |
|
py::tuple args = py::make_tuple(1234); |
|
py::dict kwargs = py::dict("to"_a=some_instance); |
|
f(*args, "say"_a="hello", **kwargs); |
|
|
|
Generalized unpacking according to PEP448_ is also supported: |
|
|
|
.. code-block:: cpp |
|
|
|
py::dict kwargs1 = py::dict("number"_a=1234); |
|
py::dict kwargs2 = py::dict("to"_a=some_instance); |
|
f(**kwargs1, "say"_a="hello", **kwargs2); |
|
|
|
.. seealso:: |
|
|
|
The file :file:`tests/test_pytypes.cpp` contains a complete |
|
example that demonstrates passing native Python types in more detail. The |
|
file :file:`tests/test_callbacks.cpp` presents a few examples of calling |
|
Python functions from C++, including keywords arguments and unpacking. |
|
|
|
.. _PEP448: https://www.python.org/dev/peps/pep-0448/ |
|
|
|
.. _implicit_casting: |
|
|
|
Implicit casting |
|
================ |
|
|
|
When using the C++ interface for Python types, or calling Python functions, |
|
objects of type :class:`object` are returned. It is possible to invoke implicit |
|
conversions to subclasses like :class:`dict`. The same holds for the proxy objects |
|
returned by ``operator[]`` or ``obj.attr()``. |
|
Casting to subtypes improves code readability and allows values to be passed to |
|
C++ functions that require a specific subtype rather than a generic :class:`object`. |
|
|
|
.. code-block:: cpp |
|
|
|
#include <pybind11/numpy.h> |
|
using namespace pybind11::literals; |
|
|
|
py::module_ os = py::module_::import("os"); |
|
py::module_ path = py::module_::import("os.path"); // like 'import os.path as path' |
|
py::module_ np = py::module_::import("numpy"); // like 'import numpy as np' |
|
|
|
py::str curdir_abs = path.attr("abspath")(path.attr("curdir")); |
|
py::print(py::str("Current directory: ") + curdir_abs); |
|
py::dict environ = os.attr("environ"); |
|
py::print(environ["HOME"]); |
|
py::array_t<float> arr = np.attr("ones")(3, "dtype"_a="float32"); |
|
py::print(py::repr(arr + py::int_(1))); |
|
|
|
These implicit conversions are available for subclasses of :class:`object`; there |
|
is no need to call ``obj.cast()`` explicitly as for custom classes, see |
|
:ref:`casting_back_and_forth`. |
|
|
|
.. note:: |
|
If a trivial conversion via move constructor is not possible, both implicit and |
|
explicit casting (calling ``obj.cast()``) will attempt a "rich" conversion. |
|
For instance, ``py::list env = os.attr("environ");`` will succeed and is |
|
equivalent to the Python code ``env = list(os.environ)`` that produces a |
|
list of the dict keys. |
|
|
|
.. TODO: Adapt text once PR #2349 has landed |
|
|
|
Handling exceptions |
|
=================== |
|
|
|
Python exceptions from wrapper classes will be thrown as a ``py::error_already_set``. |
|
See :ref:`Handling exceptions from Python in C++ |
|
<handling_python_exceptions_cpp>` for more information on handling exceptions |
|
raised when calling C++ wrapper classes. |
|
|
|
.. _pytypes_gotchas: |
|
|
|
Gotchas |
|
======= |
|
|
|
Default-Constructed Wrappers |
|
---------------------------- |
|
|
|
When a wrapper type is default-constructed, it is **not** a valid Python object (i.e. it is not ``py::none()``). It is simply the same as |
|
``PyObject*`` null pointer. To check for this, use |
|
``static_cast<bool>(my_wrapper)``. |
|
|
|
Assigning py::none() to wrappers |
|
-------------------------------- |
|
|
|
You may be tempted to use types like ``py::str`` and ``py::dict`` in C++ |
|
signatures (either pure C++, or in bound signatures), and assign them default |
|
values of ``py::none()``. However, in a best case scenario, it will fail fast |
|
because ``None`` is not convertible to that type (e.g. ``py::dict``), or in a |
|
worse case scenario, it will silently work but corrupt the types you want to |
|
work with (e.g. ``py::str(py::none())`` will yield ``"None"`` in Python).
|
|
|