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.
		
		
		
		
		
			
		
			
				
					
					
						
							1299 lines
						
					
					
						
							46 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							1299 lines
						
					
					
						
							46 KiB
						
					
					
				| .. _advanced: | |
|  | |
| Advanced topics | |
| ############### | |
|  | |
| For brevity, the rest of this chapter assumes that the following two lines are | |
| present: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     #include <pybind11/pybind11.h> | |
|  | |
|     namespace py = pybind11; | |
| 
 | |
| Exporting constants and mutable objects | |
| ======================================= | |
|  | |
| To expose a C++ constant, use the ``attr`` function to register it in a module | |
| as shown below. The ``int_`` class is one of many small wrapper objects defined | |
| in ``pybind11/pytypes.h``. General objects (including integers) can also be | |
| converted using the function ``cast``. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
|         m.attr("MY_CONSTANT") = py::int_(123); | |
|         m.attr("MY_CONSTANT_2") = py::cast(new MyObject()); | |
|     } | |
| 
 | |
| Operator overloading | |
| ==================== | |
|  | |
| Suppose that we're given the following ``Vector2`` class with a vector addition | |
| and scalar multiplication operation, all implemented using overloaded operators | |
| in C++. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Vector2 { | |
|     public: | |
|         Vector2(float x, float y) : x(x), y(y) { } | |
| 
 | |
|         std::string toString() const { return "[" + std::to_string(x) + ", " + std::to_string(y) + "]"; } | |
| 
 | |
|         Vector2 operator+(const Vector2 &v) const { return Vector2(x + v.x, y + v.y); } | |
|         Vector2 operator*(float value) const { return Vector2(x * value, y * value); } | |
|         Vector2& operator+=(const Vector2 &v) { x += v.x; y += v.y; return *this; } | |
|         Vector2& operator*=(float v) { x *= v; y *= v; return *this; } | |
| 
 | |
|         friend Vector2 operator*(float f, const Vector2 &v) { return Vector2(f * v.x, f * v.y); } | |
| 
 | |
|     private: | |
|         float x, y; | |
|     }; | |
| 
 | |
| The following snippet shows how the above operators can be conveniently exposed | |
| to Python. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     #include <pybind11/operators.h> | |
|  | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
| 
 | |
|         py::class_<Vector2>(m, "Vector2") | |
|             .def(py::init<float, float>()) | |
|             .def(py::self + py::self) | |
|             .def(py::self += py::self) | |
|             .def(py::self *= float()) | |
|             .def(float() * py::self) | |
|             .def("__repr__", &Vector2::toString); | |
| 
 | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| Note that a line like | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|             .def(py::self * float()) | |
| 
 | |
| is really just short hand notation for | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     .def("__mul__", [](const Vector2 &a, float b) { | |
|         return a * b; | |
|     }) | |
| 
 | |
| This can be useful for exposing additional operators that don't exist on the | |
| C++ side, or to perform other types of customization. | |
|  | |
| .. note:: | |
|  | |
|     To use the more convenient ``py::self`` notation, the additional | |
|     header file :file:`pybind11/operators.h` must be included. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example3.cpp` contains a complete example that | |
|     demonstrates how to work with overloaded operators in more detail. | |
|  | |
| Callbacks and passing anonymous functions | |
| ========================================= | |
|  | |
| The C++11 standard brought lambda functions and the generic polymorphic | |
| function wrapper ``std::function<>`` to the C++ programming language, which | |
| enable powerful new ways of working with functions. Lambda functions come in | |
| two flavors: stateless lambda function resemble classic function pointers that | |
| link to an anonymous piece of code, while stateful lambda functions | |
| additionally depend on captured variables that are stored in an anonymous | |
| *lambda closure object*. | |
|  | |
| Here is a simple example of a C++ function that takes an arbitrary function | |
| (stateful or stateless) with signature ``int -> int`` as an argument and runs | |
| it with the value 10. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     int func_arg(const std::function<int(int)> &f) { | |
|         return f(10); | |
|     } | |
| 
 | |
| The example below is more involved: it takes a function of signature ``int -> int`` | |
| and returns another function of the same kind. The return value is a stateful | |
| lambda function, which stores the value ``f`` in the capture object and adds 1 to | |
| its return value upon execution. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     std::function<int(int)> func_ret(const std::function<int(int)> &f) { | |
|         return [f](int i) { | |
|             return f(i) + 1; | |
|         }; | |
|     } | |
| 
 | |
| After including the extra header file :file:`pybind11/functional.h`, it is almost | |
| trivial to generate binding code for both of these functions. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     #include <pybind11/functional.h> | |
|  | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
| 
 | |
|         m.def("func_arg", &func_arg); | |
|         m.def("func_ret", &func_ret); | |
| 
 | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| The following interactive session shows how to call them from Python. | |
|  | |
| .. code-block:: python | |
| 
 | |
|     $ python | |
|     >>> import example | |
|     >>> def square(i): | |
|     ...     return i * i | |
|     ... | |
|     >>> example.func_arg(square) | |
|     100L | |
|     >>> square_plus_1 = example.func_ret(square) | |
|     >>> square_plus_1(4) | |
|     17L | |
|     >>> | |
| 
 | |
| .. note:: | |
|  | |
|     This functionality is very useful when generating bindings for callbacks in | |
|     C++ libraries (e.g. a graphical user interface library). | |
|  | |
|     The file :file:`example/example5.cpp` contains a complete example that | |
|     demonstrates how to work with callbacks and anonymous functions in more detail. | |
|  | |
| .. warning:: | |
|  | |
|     Keep in mind that passing a function from C++ to Python (or vice versa) | |
|     will instantiate a piece of wrapper code that translates function | |
|     invocations between the two languages. Copying the same function back and | |
|     forth between Python and C++ many times in a row will cause these wrappers | |
|     to accumulate, which can decrease performance. | |
|  | |
| Overriding virtual functions in Python | |
| ====================================== | |
|  | |
| Suppose that a C++ class or interface has a virtual function that we'd like to | |
| to override from within Python (we'll focus on the class ``Animal``; ``Dog`` is | |
| given as a specific example of how one would do this with traditional C++ | |
| code). | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Animal { | |
|     public: | |
|         virtual ~Animal() { } | |
|         virtual std::string go(int n_times) = 0; | |
|     }; | |
| 
 | |
|     class Dog : public Animal { | |
|     public: | |
|         std::string go(int n_times) { | |
|             std::string result; | |
|             for (int i=0; i<n_times; ++i) | |
|                 result += "woof! "; | |
|             return result; | |
|         } | |
|     }; | |
| 
 | |
| Let's also suppose that we are given a plain function which calls the | |
| function ``go()`` on an arbitrary ``Animal`` instance. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     std::string call_go(Animal *animal) { | |
|         return animal->go(3); | |
|     } | |
| 
 | |
| Normally, the binding code for these classes would look as follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
| 
 | |
|         py::class_<Animal> animal(m, "Animal"); | |
|         animal | |
|             .def("go", &Animal::go); | |
| 
 | |
|         py::class_<Dog>(m, "Dog", animal) | |
|             .def(py::init<>()); | |
| 
 | |
|         m.def("call_go", &call_go); | |
| 
 | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| However, these bindings are impossible to extend: ``Animal`` is not | |
| constructible, and we clearly require some kind of "trampoline" that | |
| redirects virtual calls back to Python. | |
|  | |
| Defining a new type of ``Animal`` from within Python is possible but requires a | |
| helper class that is defined as follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class PyAnimal : public Animal { | |
|     public: | |
|         /* Inherit the constructors */ | |
|         using Animal::Animal; | |
| 
 | |
|         /* Trampoline (need one for each virtual function) */ | |
|         std::string go(int n_times) { | |
|             PYBIND11_OVERLOAD_PURE( | |
|                 std::string, /* Return type */ | |
|                 Animal,      /* Parent class */ | |
|                 go,          /* Name of function */ | |
|                 n_times      /* Argument(s) */ | |
|             ); | |
|         } | |
|     }; | |
| 
 | |
| The macro :func:`PYBIND11_OVERLOAD_PURE` should be used for pure virtual | |
| functions, and :func:`PYBIND11_OVERLOAD` should be used for functions which have | |
| a default implementation. The binding code also needs a few minor adaptations | |
| (highlighted): | |
|  | |
| .. code-block:: cpp | |
|     :emphasize-lines: 4,6,7 | |
|  | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
|  | |
|         py::class_<PyAnimal> animal(m, "Animal"); | |
|         animal | |
|             .alias<Animal>() | |
|             .def(py::init<>()) | |
|             .def("go", &Animal::go); | |
|  | |
|         py::class_<Dog>(m, "Dog", animal) | |
|             .def(py::init<>()); | |
|  | |
|         m.def("call_go", &call_go); | |
|  | |
|         return m.ptr(); | |
|     } | |
|  | |
| Importantly, the trampoline helper class is used as the template argument to | |
| :class:`class_`, and a call to :func:`class_::alias` informs the binding | |
| generator that this is merely an alias for the underlying type ``Animal``. | |
| Following this, we are able to define a constructor as usual. | |
|  | |
| The Python session below shows how to override ``Animal::go`` and invoke it via | |
| a virtual method call. | |
|  | |
| .. code-block:: python | |
| 
 | |
|     >>> from example import * | |
|     >>> d = Dog() | |
|     >>> call_go(d) | |
|     u'woof! woof! woof! ' | |
|     >>> class Cat(Animal): | |
|     ...     def go(self, n_times): | |
|     ...             return "meow! " * n_times | |
|     ... | |
|     >>> c = Cat() | |
|     >>> call_go(c) | |
|     u'meow! meow! meow! ' | |
| 
 | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example12.cpp` contains a complete example that | |
|     demonstrates how to override virtual functions using pybind11 in more | |
|     detail. | |
|  | |
|  | |
| Global Interpreter Lock (GIL) | |
| ============================= | |
|  | |
| The classes :class:`gil_scoped_release` and :class:`gil_scoped_acquire` can be | |
| used to acquire and release the global interpreter lock in the body of a C++ | |
| function call. In this way, long-running C++ code can be parallelized using | |
| multiple Python threads. Taking the previous section as an example, this could | |
| be realized as follows (important changes highlighted): | |
|  | |
| .. code-block:: cpp | |
|     :emphasize-lines: 8,9,33,34 | |
|  | |
|     class PyAnimal : public Animal { | |
|     public: | |
|         /* Inherit the constructors */ | |
|         using Animal::Animal; | |
|  | |
|         /* Trampoline (need one for each virtual function) */ | |
|         std::string go(int n_times) { | |
|             /* Acquire GIL before calling Python code */ | |
|             py::gil_scoped_acquire acquire; | |
|  | |
|             PYBIND11_OVERLOAD_PURE( | |
|                 std::string, /* Return type */ | |
|                 Animal,      /* Parent class */ | |
|                 go,          /* Name of function */ | |
|                 n_times      /* Argument(s) */ | |
|             ); | |
|         } | |
|     }; | |
|  | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
|  | |
|         py::class_<PyAnimal> animal(m, "Animal"); | |
|         animal | |
|             .alias<Animal>() | |
|             .def(py::init<>()) | |
|             .def("go", &Animal::go); | |
|  | |
|         py::class_<Dog>(m, "Dog", animal) | |
|             .def(py::init<>()); | |
|  | |
|         m.def("call_go", [](Animal *animal) -> std::string { | |
|             /* Release GIL before calling into (potentially long-running) C++ code */ | |
|             py::gil_scoped_release release; | |
|             return call_go(animal); | |
|         }); | |
|  | |
|         return m.ptr(); | |
|     } | |
|  | |
| Passing STL data structures | |
| =========================== | |
|  | |
| When including the additional header file :file:`pybind11/stl.h`, conversions | |
| between ``std::vector<>``, ``std::list<>``, ``std::set<>``, and ``std::map<>`` | |
| and the Python ``list``, ``set`` and ``dict`` data structures are automatically | |
| enabled. The types ``std::pair<>`` and ``std::tuple<>`` are already supported | |
| out of the box with just the core :file:`pybind11/pybind11.h` header. | |
|  | |
| .. note:: | |
|  | |
|     Arbitrary nesting of any of these types is supported. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example2.cpp` contains a complete example that | |
|     demonstrates how to pass STL data types in more detail. | |
|  | |
| Binding sequence data types, iterators, the slicing protocol, etc. | |
| ================================================================== | |
|  | |
| Please refer to the supplemental example for details. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example6.cpp` contains a complete example that | |
|     shows how to bind a sequence data type, including length queries | |
|     (``__len__``), iterators (``__iter__``), the slicing protocol and other | |
|     kinds of useful operations. | |
|  | |
| Return value policies | |
| ===================== | |
|  | |
| Python and C++ use wildly different ways of managing the memory and lifetime of | |
| objects managed by them. This can lead to issues when creating bindings for | |
| functions that return a non-trivial type. Just by looking at the type | |
| information, it is not clear whether Python should take charge of the returned | |
| value and eventually free its resources, or if this is handled on the C++ side. | |
| For this reason, pybind11 provides a several `return value policy` annotations | |
| that can be passed to the :func:`module::def` and :func:`class_::def` | |
| functions. The default policy is :enum:`return_value_policy::automatic`. | |
|  | |
|  | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | Return value policy                              | Description                                                               | | |
| +==================================================+===========================================================================+ | |
| | :enum:`return_value_policy::automatic`           | Automatic: copy objects returned as values and take ownership of          | | |
| |                                                  | objects returned as pointers                                              | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | :enum:`return_value_policy::automatic_reference` | Automatic variant 2 : copy objects returned as values and reference       | | |
| |                                                  | objects returned as pointers                                              | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | :enum:`return_value_policy::copy`                | Create a new copy of the returned object, which will be owned by Python   | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | :enum:`return_value_policy::take_ownership`      | Reference the existing object and take ownership. Python will call        | | |
| |                                                  | the destructor and delete operator when the reference count reaches zero  | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | :enum:`return_value_policy::reference`           | Reference the object, but do not take ownership and defer responsibility  | | |
| |                                                  | for deleting it to C++ (dangerous when C++ code at some point decides to  | | |
| |                                                  | delete it while Python still has a nonzero reference count)               | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
| | :enum:`return_value_policy::reference_internal`  | Reference the object, but do not take ownership. The object is considered | | |
| |                                                  | be owned by the C++ instance whose method or property returned it. The    | | |
| |                                                  | Python object will increase the reference count of this 'parent' by 1     | | |
| |                                                  | to ensure that it won't be deallocated while Python is using the 'child'  | | |
| +--------------------------------------------------+---------------------------------------------------------------------------+ | |
|  | |
| .. warning:: | |
|  | |
|     Code with invalid call policies might access unitialized memory and free | |
|     data structures multiple times, which can lead to hard-to-debug | |
|     non-determinism and segmentation faults, hence it is worth spending the | |
|     time to understand all the different options above. | |
|  | |
| See below for an example that uses the | |
| :enum:`return_value_policy::reference_internal` policy. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Example { | |
|     public: | |
|         Internal &get_internal() { return internal; } | |
|     private: | |
|         Internal internal; | |
|     }; | |
| 
 | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example", "pybind11 example plugin"); | |
| 
 | |
|         py::class_<Example>(m, "Example") | |
|             .def(py::init<>()) | |
|             .def("get_internal", &Example::get_internal, "Return the internal data", py::return_value_policy::reference_internal); | |
| 
 | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| 
 | |
| Additional call policies | |
| ======================== | |
|  | |
| In addition to the above return value policies, further `call policies` can be | |
| specified to indicate dependencies between parameters. There is currently just | |
| one policy named ``keep_alive<Nurse, Patient>``, which indicates that the | |
| argument with index ``Patient`` should be kept alive at least until the | |
| argument with index ``Nurse`` is freed by the garbage collector; argument | |
| indices start at one, while zero refers to the return value. Arbitrarily many | |
| call policies can be specified. | |
|  | |
| For instance, binding code for a a list append operation that ties the lifetime | |
| of the newly added element to the underlying container might be declared as | |
| follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<List>(m, "List") | |
|         .def("append", &List::append, py::keep_alive<1, 2>()); | |
| 
 | |
| .. note:: | |
|  | |
|     ``keep_alive`` is analogous to the ``with_custodian_and_ward`` (if Nurse, | |
|     Patient != 0) and ``with_custodian_and_ward_postcall`` (if Nurse/Patient == | |
|     0) policies from Boost.Python. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example13.cpp` contains a complete example that | |
|     demonstrates using :class:`keep_alive` in more detail. | |
|  | |
| Implicit type conversions | |
| ========================= | |
|  | |
| Suppose that instances of two types ``A`` and ``B`` are used in a project, and | |
| that an ``A`` can easily be converted into a an instance of type ``B`` (examples of this | |
| could be a fixed and an arbitrary precision number type). | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<A>(m, "A") | |
|         /// ... members ... | |
|  | |
|     py::class_<B>(m, "B") | |
|         .def(py::init<A>()) | |
|         /// ... members ... | |
|  | |
|     m.def("func", | |
|         [](const B &) { /* .... */ } | |
|     ); | |
| 
 | |
| To invoke the function ``func`` using a variable ``a`` containing an ``A`` | |
| instance, we'd have to write ``func(B(a))`` in Python. On the other hand, C++ | |
| will automatically apply an implicit type conversion, which makes it possible | |
| to directly write ``func(a)``. | |
|  | |
| In this situation (i.e. where ``B`` has a constructor that converts from | |
| ``A``), the following statement enables similar implicit conversions on the | |
| Python side: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::implicitly_convertible<A, B>(); | |
| 
 | |
| Unique pointers | |
| =============== | |
|  | |
| Given a class ``Example`` with Python bindings, it's possible to return | |
| instances wrapped in C++11 unique pointers, like so | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     std::unique_ptr<Example> create_example() { return std::unique_ptr<Example>(new Example()); } | |
| 
 | |
| .. code-block:: cpp | |
| 
 | |
|     m.def("create_example", &create_example); | |
| 
 | |
| In other words, there is nothing special that needs to be done. While returning | |
| unique pointers in this way is allowed, it is *illegal* to use them as function | |
| arguments. For instance, the following function signature cannot be processed | |
| by pybind11. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     void do_something_with_example(std::unique_ptr<Example> ex) { ... } | |
| 
 | |
| The above signature would imply that Python needs to give up ownership of an | |
| object that is passed to this function, which is generally not possible (for | |
| instance, the object might be referenced elsewhere). | |
|  | |
| Smart pointers | |
| ============== | |
|  | |
| This section explains how to pass values that are wrapped in "smart" pointer | |
| types with internal reference counting. For simpler C++11 unique pointers, | |
| please refer to the previous section. | |
|  | |
| The binding generator for classes (:class:`class_`) takes an optional second | |
| template type, which denotes a special *holder* type that is used to manage | |
| references to the object. When wrapping a type named ``Type``, the default | |
| value of this template parameter is ``std::unique_ptr<Type>``, which means that | |
| the object is deallocated when Python's reference count goes to zero. | |
|  | |
| It is possible to switch to other types of reference counting wrappers or smart | |
| pointers, which is useful in codebases that rely on them. For instance, the | |
| following snippet causes ``std::shared_ptr`` to be used instead. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Example, std::shared_ptr<Example> /* <- holder type */> obj(m, "Example"); | |
| 
 | |
| Note that any particular class can only be associated with a single holder type. | |
|  | |
| To enable transparent conversions for functions that take shared pointers as an | |
| argument or that return them, a macro invocation similar to the following must | |
| be declared at the top level before any binding code: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     PYBIND11_DECLARE_HOLDER_TYPE(T, std::shared_ptr<T>); | |
| 
 | |
| .. note:: | |
|  | |
|     The first argument of :func:`PYBIND11_DECLARE_HOLDER_TYPE` should be a | |
|     placeholder name that is used as a template parameter of the second | |
|     argument. Thus, feel free to use any identifier, but use it consistently on | |
|     both sides; also, don't use the name of a type that already exists in your | |
|     codebase. | |
|  | |
| One potential stumbling block when using holder types is that they need to be | |
| applied consistently. Can you guess what's broken about the following binding | |
| code? | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Child { }; | |
| 
 | |
|     class Parent { | |
|     public: | |
|        Parent() : child(std::make_shared<Child>()) { } | |
|        Child *get_child() { return child.get(); }  /* Hint: ** DON'T DO THIS ** */ | |
|     private: | |
|         std::shared_ptr<Child> child; | |
|     }; | |
| 
 | |
|     PYBIND11_PLUGIN(example) { | |
|         py::module m("example"); | |
| 
 | |
|         py::class_<Child, std::shared_ptr<Child>>(m, "Child"); | |
| 
 | |
|         py::class_<Parent, std::shared_ptr<Parent>>(m, "Parent") | |
|            .def(py::init<>()) | |
|            .def("get_child", &Parent::get_child); | |
| 
 | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| The following Python code will cause undefined behavior (and likely a | |
| segmentation fault). | |
|  | |
| .. code-block:: python | |
| 
 | |
|    from example import Parent | |
|    print(Parent().get_child()) | |
| 
 | |
| The problem is that ``Parent::get_child()`` returns a pointer to an instance of | |
| ``Child``, but the fact that this instance is already managed by | |
| ``std::shared_ptr<...>`` is lost when passing raw pointers. In this case, | |
| pybind11 will create a second independent ``std::shared_ptr<...>`` that also | |
| claims ownership of the pointer. In the end, the object will be freed **twice** | |
| since these shared pointers have no way of knowing about each other. | |
|  | |
| There are two ways to resolve this issue: | |
|  | |
| 1. For types that are managed by a smart pointer class, never use raw pointers | |
|    in function arguments or return values. In other words: always consistently | |
|    wrap pointers into their designated holder types (such as | |
|    ``std::shared_ptr<...>``). In this case, the signature of ``get_child()`` | |
|    should be modified as follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     std::shared_ptr<Child> get_child() { return child; } | |
| 
 | |
| 2. Adjust the definition of ``Child`` by specifying | |
|    ``std::enable_shared_from_this<T>`` (see cppreference_ for details) as a | |
|    base class. This adds a small bit of information to ``Child`` that allows | |
|    pybind11 to realize that there is already an existing | |
|    ``std::shared_ptr<...>`` and communicate with it. In this case, the | |
|    declaration of ``Child`` should look as follows: | |
|  | |
| .. _cppreference: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Child : public std::enable_shared_from_this<Child> { }; | |
| 
 | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example8.cpp` contains a complete example that | |
|     demonstrates how to work with custom reference-counting holder types in | |
|     more detail. | |
|  | |
| .. _custom_constructors: | |
|  | |
| Custom constructors | |
| =================== | |
|  | |
| The syntax for binding constructors was previously introduced, but it only | |
| works when a constructor with the given parameters actually exists on the C++ | |
| side. To extend this to more general cases, let's take a look at what actually | |
| happens under the hood: the following statement | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Example>(m, "Example") | |
|         .def(py::init<int>()); | |
| 
 | |
| is short hand notation for | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Example>(m, "Example") | |
|         .def("__init__", | |
|             [](Example &instance, int arg) { | |
|                 new (&instance) Example(arg); | |
|             } | |
|         ); | |
| 
 | |
| In other words, :func:`init` creates an anonymous function that invokes an | |
| in-place constructor. Memory allocation etc. is already take care of beforehand | |
| within pybind11. | |
|  | |
| Catching and throwing exceptions | |
| ================================ | |
|  | |
| When C++ code invoked from Python throws an ``std::exception``, it is | |
| automatically converted into a Python ``Exception``. pybind11 defines multiple | |
| special exception classes that will map to different types of Python | |
| exceptions: | |
|  | |
| +--------------------------------------+------------------------------+ | |
| |  C++ exception type                  |  Python exception type       | | |
| +======================================+==============================+ | |
| | :class:`std::exception`              | ``RuntimeError``             | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::bad_alloc`              | ``MemoryError``              | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::domain_error`           | ``ValueError``               | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::invalid_argument`       | ``ValueError``               | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::length_error`           | ``ValueError``               | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::out_of_range`           | ``ValueError``               | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`std::range_error`            | ``ValueError``               | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`pybind11::stop_iteration`    | ``StopIteration`` (used to   | | |
| |                                      | implement custom iterators)  | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`pybind11::index_error`       | ``IndexError`` (used to      | | |
| |                                      | indicate out of bounds       | | |
| |                                      | accesses in ``__getitem__``, | | |
| |                                      | ``__setitem__``, etc.)       | | |
| +--------------------------------------+------------------------------+ | |
| | :class:`pybind11::error_already_set` | Indicates that the Python    | | |
| |                                      | exception flag has already   | | |
| |                                      | been initialized             | | |
| +--------------------------------------+------------------------------+ | |
|  | |
| When a Python function invoked from C++ throws an exception, it is converted | |
| into a C++ exception of type :class:`error_already_set` whose string payload | |
| contains a textual summary. | |
|  | |
| There is also a special exception :class:`cast_error` that is thrown by | |
| :func:`handle::call` when the input arguments cannot be converted to Python | |
| objects. | |
|  | |
| Buffer protocol | |
| =============== | |
|  | |
| Python supports an extremely general and convenient approach for exchanging | |
| data between plugin libraries. Types can expose a buffer view [#f1]_, | |
| which provides fast direct access to the raw internal representation. Suppose | |
| we want to bind the following simplistic Matrix class: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Matrix { | |
|     public: | |
|         Matrix(size_t rows, size_t cols) : m_rows(rows), m_cols(cols) { | |
|             m_data = new float[rows*cols]; | |
|         } | |
|         float *data() { return m_data; } | |
|         size_t rows() const { return m_rows; } | |
|         size_t cols() const { return m_cols; } | |
|     private: | |
|         size_t m_rows, m_cols; | |
|         float *m_data; | |
|     }; | |
| 
 | |
| The following binding code exposes the ``Matrix`` contents as a buffer object, | |
| making it possible to cast Matrixes into NumPy arrays. It is even possible to | |
| completely avoid copy operations with Python expressions like | |
| ``np.array(matrix_instance, copy = False)``. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Matrix>(m, "Matrix") | |
|        .def_buffer([](Matrix &m) -> py::buffer_info { | |
|             return py::buffer_info( | |
|                 m.data(),                              /* Pointer to buffer */ | |
|                 sizeof(float),                         /* Size of one scalar */ | |
|                 py::format_descriptor<float>::value(), /* Python struct-style format descriptor */ | |
|                 2,                                     /* Number of dimensions */ | |
|                 { m.rows(), m.cols() },                /* Buffer dimensions */ | |
|                 { sizeof(float) * m.rows(),            /* Strides (in bytes) for each index */ | |
|                   sizeof(float) } | |
|             ); | |
|         }); | |
| 
 | |
| The snippet above binds a lambda function, which can create ``py::buffer_info`` | |
| description records on demand describing a given matrix. The contents of | |
| ``py::buffer_info`` mirror the Python buffer protocol specification. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     struct buffer_info { | |
|         void *ptr; | |
|         size_t itemsize; | |
|         std::string format; | |
|         int ndim; | |
|         std::vector<size_t> shape; | |
|         std::vector<size_t> strides; | |
|     }; | |
| 
 | |
| To create a C++ function that can take a Python buffer object as an argument, | |
| simply use the type ``py::buffer`` as one of its arguments. Buffers can exist | |
| in a great variety of configurations, hence some safety checks are usually | |
| necessary in the function body. Below, you can see an basic example on how to | |
| define a custom constructor for the Eigen double precision matrix | |
| (``Eigen::MatrixXd``) type, which supports initialization from compatible | |
| buffer | |
| objects (e.g. a NumPy matrix). | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Eigen::MatrixXd>(m, "MatrixXd") | |
|         .def("__init__", [](Eigen::MatrixXd &m, py::buffer b) { | |
|             /* Request a buffer descriptor from Python */ | |
|             py::buffer_info info = b.request(); | |
| 
 | |
|             /* Some sanity checks ... */ | |
|             if (info.format != py::format_descriptor<double>::value()) | |
|                 throw std::runtime_error("Incompatible format: expected a double array!"); | |
| 
 | |
|             if (info.ndim != 2) | |
|                 throw std::runtime_error("Incompatible buffer dimension!"); | |
| 
 | |
|             if (info.strides[0] == sizeof(double)) { | |
|                 /* Buffer has the right layout -- directly copy. */ | |
|                 new (&m) Eigen::MatrixXd(info.shape[0], info.shape[1]); | |
|                 memcpy(m.data(), info.ptr, sizeof(double) * m.size()); | |
|             } else { | |
|                 /* Oops -- the buffer is transposed */ | |
|                 new (&m) Eigen::MatrixXd(info.shape[1], info.shape[0]); | |
|                 memcpy(m.data(), info.ptr, sizeof(double) * m.size()); | |
|                 m.transposeInPlace(); | |
|             } | |
|         }); | |
| 
 | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example7.cpp` contains a complete example that | |
|     demonstrates using the buffer protocol with pybind11 in more detail. | |
|  | |
| .. [#f1] http://docs.python.org/3/c-api/buffer.html | |
|  | |
| NumPy support | |
| ============= | |
|  | |
| By exchanging ``py::buffer`` with ``py::array`` in the above snippet, we can | |
| restrict the function so that it only accepts NumPy arrays (rather than any | |
| type of Python object satisfying the buffer protocol). | |
|  | |
| In many situations, we want to define a function which only accepts a NumPy | |
| array of a certain data type. This is possible via the ``py::array_t<T>`` | |
| template. For instance, the following function requires the argument to be a | |
| dense array of doubles in C-style ordering. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     void f(py::array_t<double> array); | |
| 
 | |
| When it is invoked with a different type (e.g. an integer), the binding code | |
| will attempt to cast the input into a NumPy array of the requested type. Note | |
| that this feature requires the :file:``pybind11/numpy.h`` header to be | |
| included. | |
|  | |
| Vectorizing functions | |
| ===================== | |
|  | |
| Suppose we want to bind a function with the following signature to Python so | |
| that it can process arbitrary NumPy array arguments (vectors, matrices, general | |
| N-D arrays) in addition to its normal arguments: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     double my_func(int x, float y, double z); | |
| 
 | |
| After including the ``pybind11/numpy.h`` header, this is extremely simple: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     m.def("vectorized_func", py::vectorize(my_func)); | |
| 
 | |
| Invoking the function like below causes 4 calls to be made to ``my_func`` with | |
| each of the the array elements. The significant advantage of this compared to | |
| solutions like ``numpy.vectorize()`` is that the loop over the elements runs | |
| entirely on the C++ side and can be crunched down into a tight, optimized loop | |
| by the compiler. The result is returned as a NumPy array of type | |
| ``numpy.dtype.float64``. | |
|  | |
| .. code-block:: python | |
| 
 | |
|     >>> x = np.array([[1, 3],[5, 7]]) | |
|     >>> y = np.array([[2, 4],[6, 8]]) | |
|     >>> z = 3 | |
|     >>> result = vectorized_func(x, y, z) | |
| 
 | |
| The scalar argument ``z`` is transparently replicated 4 times.  The input | |
| arrays ``x`` and ``y`` are automatically converted into the right types (they | |
| are of type  ``numpy.dtype.int64`` but need to be ``numpy.dtype.int32`` and | |
| ``numpy.dtype.float32``, respectively) | |
|  | |
| Sometimes we might want to explitly exclude an argument from the vectorization | |
| because it makes little sense to wrap it in a NumPy array. For instance, | |
| suppose the function signature was | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     double my_func(int x, float y, my_custom_type *z); | |
| 
 | |
| This can be done with a stateful Lambda closure: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     // Vectorize a lambda function with a capture object (e.g. to exclude some arguments from the vectorization) | |
|     m.def("vectorized_func", | |
|         [](py::array_t<int> x, py::array_t<float> y, my_custom_type *z) { | |
|             auto stateful_closure = [z](int x, float y) { return my_func(x, y, z); }; | |
|             return py::vectorize(stateful_closure)(x, y); | |
|         } | |
|     ); | |
| 
 | |
| In cases where the computation is too complicated to be reduced to | |
| ``vectorize``, it will be necessary to create and access the buffer contents | |
| manually. The following snippet contains a complete example that shows how this | |
| works (the code is somewhat contrived, since it could have been done more | |
| simply using ``vectorize``). | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     #include <pybind11/pybind11.h> | |
|     #include <pybind11/numpy.h> | |
|  | |
|     namespace py = pybind11; | |
| 
 | |
|     py::array_t<double> add_arrays(py::array_t<double> input1, py::array_t<double> input2) { | |
|         auto buf1 = input1.request(), buf2 = input2.request(); | |
| 
 | |
|         if (buf1.ndim != 1 || buf2.ndim != 1) | |
|             throw std::runtime_error("Number of dimensions must be one"); | |
| 
 | |
|         if (buf1.shape[0] != buf2.shape[0]) | |
|             throw std::runtime_error("Input shapes must match"); | |
| 
 | |
|         auto result = py::array(py::buffer_info( | |
|             nullptr,            /* Pointer to data (nullptr -> ask NumPy to allocate!) */ | |
|             sizeof(double),     /* Size of one item */ | |
|             py::format_descriptor<double>::value(), /* Buffer format */ | |
|             buf1.ndim,          /* How many dimensions? */ | |
|             { buf1.shape[0] },  /* Number of elements for each dimension */ | |
|             { sizeof(double) }  /* Strides for each dimension */ | |
|         )); | |
| 
 | |
|         auto buf3 = result.request(); | |
| 
 | |
|         double *ptr1 = (double *) buf1.ptr, | |
|                *ptr2 = (double *) buf2.ptr, | |
|                *ptr3 = (double *) buf3.ptr; | |
| 
 | |
|         for (size_t idx = 0; idx < buf1.shape[0]; idx++) | |
|             ptr3[idx] = ptr1[idx] + ptr2[idx]; | |
| 
 | |
|         return result; | |
|     } | |
| 
 | |
|     PYBIND11_PLUGIN(test) { | |
|         py::module m("test"); | |
|         m.def("add_arrays", &add_arrays, "Add two NumPy arrays"); | |
|         return m.ptr(); | |
|     } | |
| 
 | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example10.cpp` contains a complete example that | |
|     demonstrates using :func:`vectorize` in more detail. | |
|  | |
| Functions taking Python objects as arguments | |
| ============================================ | |
|  | |
| pybind11 exposes all major Python types using thin C++ wrapper classes. These | |
| wrapper classes can also be used as parameters of functions in bindings, which | |
| makes it possible to directly work with native Python types on the C++ side. | |
| For instance, the following statement iterates over a Python ``dict``: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     void print_dict(py::dict dict) { | |
|         /* Easily interact with Python types */ | |
|         for (auto item : dict) | |
|             std::cout << "key=" << item.first << ", " | |
|                       << "value=" << item.second << std::endl; | |
|     } | |
| 
 | |
| 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:`capsule`, | |
| :class:`function`, :class:`buffer`, :class:`array`, and :class:`array_t`. | |
|  | |
| In this kind of mixed code, it is often necessary to convert arbitrary C++ | |
| types to Python, which can be done using :func:`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`. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example2.cpp` contains a complete example that | |
|     demonstrates passing native Python types in more detail. | |
|  | |
| Default arguments revisited | |
| =========================== | |
|  | |
| The section on :ref:`default_args` previously discussed basic usage of default | |
| arguments using pybind11. One noteworthy aspect of their implementation is that | |
| default arguments are converted to Python objects right at declaration time. | |
| Consider the following example: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<MyClass>("MyClass") | |
|         .def("myFunction", py::arg("arg") = SomeType(123)); | |
| 
 | |
| In this case, pybind11 must already be set up to deal with values of the type | |
| ``SomeType`` (via a prior instantiation of ``py::class_<SomeType>``), or an | |
| exception will be thrown. | |
|  | |
| Another aspect worth highlighting is that the "preview" of the default argument | |
| in the function signature is generated using the object's ``__repr__`` method. | |
| If not available, the signature may not be very helpful, e.g.: | |
|  | |
| .. code-block:: python | |
| 
 | |
|     FUNCTIONS | |
|     ... | |
|     |  myFunction(...) | |
|     |      Signature : (MyClass, arg : SomeType = <SomeType object at 0x101b7b080>) -> NoneType | |
|     ... | |
| 
 | |
| The first way of addressing this is by defining ``SomeType.__repr__``. | |
| Alternatively, it is possible to specify the human-readable preview of the | |
| default argument manually using the ``arg_t`` notation: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<MyClass>("MyClass") | |
|         .def("myFunction", py::arg_t<SomeType>("arg", SomeType(123), "SomeType(123)")); | |
| 
 | |
| Sometimes it may be necessary to pass a null pointer value as a default | |
| argument. In this case, remember to cast it to the underlying type in question, | |
| like so: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<MyClass>("MyClass") | |
|         .def("myFunction", py::arg("arg") = (SomeType *) nullptr); | |
| 
 | |
| Partitioning code over multiple extension modules | |
| ================================================= | |
|  | |
| It's straightforward to split binding code over multiple extension modules, | |
| while referencing types that are declared elsewhere. Everything "just" works | |
| without any special precautions. One exception to this rule occurs when | |
| extending a type declared in another extension module. Recall the basic example | |
| from Section :ref:`inheritance`. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Pet> pet(m, "Pet"); | |
|     pet.def(py::init<const std::string &>()) | |
|        .def_readwrite("name", &Pet::name); | |
| 
 | |
|     py::class_<Dog>(m, "Dog", pet /* <- specify parent */) | |
|         .def(py::init<const std::string &>()) | |
|         .def("bark", &Dog::bark); | |
| 
 | |
| Suppose now that ``Pet`` bindings are defined in a module named ``basic``, | |
| whereas the ``Dog`` bindings are defined somewhere else. The challenge is of | |
| course that the variable ``pet`` is not available anymore though it is needed | |
| to indicate the inheritance relationship to the constructor of ``class_<Dog>``. | |
| However, it can be acquired as follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::object pet = (py::object) py::module::import("basic").attr("Pet"); | |
| 
 | |
|     py::class_<Dog>(m, "Dog", pet) | |
|         .def(py::init<const std::string &>()) | |
|         .def("bark", &Dog::bark); | |
| 
 | |
| Alternatively, we can rely on the ``base`` tag, which performs an automated | |
| lookup of the corresponding Python type. However, this also requires invoking | |
| the ``import`` function once to ensure that the pybind11 binding code of the | |
| module ``basic`` has been executed. | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::module::import("basic"); | |
| 
 | |
|     py::class_<Dog>(m, "Dog", py::base<Pet>()) | |
|         .def(py::init<const std::string &>()) | |
|         .def("bark", &Dog::bark); | |
| 
 | |
| Naturally, both methods will fail when there are cyclic dependencies. | |
|  | |
| Note that compiling code which has its default symbol visibility set to | |
| *hidden* (e.g. via the command line flag ``-fvisibility=hidden`` on GCC/Clang) can interfere with the | |
| ability to access types defined in another extension module. Workarounds | |
| include changing the global symbol visibility (not recommended, because it will | |
| lead unnecessarily large binaries) or manually exporting types that are | |
| accessed by multiple extension modules: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     #ifdef _WIN32 | |
|     #  define EXPORT_TYPE __declspec(dllexport) | |
|     #else | |
|     #  define EXPORT_TYPE __attribute__ ((visibility("default"))) | |
|     #endif | |
|  | |
|     class EXPORT_TYPE Dog : public Animal { | |
|         ... | |
|     }; | |
| 
 | |
| 
 | |
| Treating STL data structures as opaque objects | |
| ============================================== | |
|  | |
| pybind11 heavily relies on a template matching mechanism to convert parameters | |
| and return values that are constructed from STL data types such as vectors, | |
| linked lists, hash tables, etc. This even works in a recursive manner, for | |
| instance to deal with lists of hash maps of pairs of elementary and custom | |
| types, etc. | |
|  | |
| A fundamental limitation of this approach is that the internal conversion | |
| between Python and C++ types involves a copy operation that prevents | |
| pass-by-reference semantics. What does this mean? | |
|  | |
| Suppose we bind the following function | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     void append_1(std::vector<int> &v) { | |
|        v.push_back(1); | |
|     } | |
| 
 | |
| and call it as follows from Python: | |
|  | |
| .. code-block:: python | |
| 
 | |
|    >>> v = [5, 6] | |
|    >>> append_1(v) | |
|    >>> print(v) | |
|    [5, 6] | |
| 
 | |
| As you can see, when passing STL data structures by reference, modifications | |
| are not propagated back the Python side. To deal with situations where this | |
| desirable, pybind11 contains a simple template wrapper class named ``opaque<T>``. | |
|  | |
| ``opaque<T>`` disables the underlying template machinery for | |
| ``T`` and can be used to treat STL types as opaque objects, whose contents are | |
| never inspected or extracted (thus, they can be passed by reference). | |
| The downside of this approach is that it the binding code becomes a bit more | |
| wordy. The above function can be bound using the following wrapper code: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|    m.def("append_1", [](py::opaque<std::vector<int>> &v) { append_1(v); }); | |
| 
 | |
| Opaque types must also have a dedicated ``class_`` declaration to define a | |
| set of admissible operations. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example14.cpp` contains a complete example that | |
|     demonstrates how to create opaque types using pybind11 in more detail. | |
|  | |
| Pickling support | |
| ================ | |
|  | |
| Python's ``pickle`` module provides a powerful facility to serialize and | |
| de-serialize a Python object graph into a binary data stream. To pickle and | |
| unpickle C++ classes using pybind11, two additional functions must be provided. | |
| Suppose the class in question has the following signature: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     class Pickleable { | |
|     public: | |
|         Pickleable(const std::string &value) : m_value(value) { } | |
|         const std::string &value() const { return m_value; } | |
| 
 | |
|         void setExtra(int extra) { m_extra = extra; } | |
|         int extra() const { return m_extra; } | |
|     private: | |
|         std::string m_value; | |
|         int m_extra = 0; | |
|     }; | |
| 
 | |
| The binding code including the requisite ``__setstate__`` and ``__getstate__`` methods [#f2]_ | |
| looks as follows: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     py::class_<Pickleable>(m, "Pickleable") | |
|         .def(py::init<std::string>()) | |
|         .def("value", &Pickleable::value) | |
|         .def("extra", &Pickleable::extra) | |
|         .def("setExtra", &Pickleable::setExtra) | |
|         .def("__getstate__", [](const Pickleable &p) { | |
|             /* Return a tuple that fully encodes the state of the object */ | |
|             return py::make_tuple(p.value(), p.extra()); | |
|         }) | |
|         .def("__setstate__", [](Pickleable &p, py::tuple t) { | |
|             if (t.size() != 2) | |
|                 throw std::runtime_error("Invalid state!"); | |
| 
 | |
|             /* Invoke the in-place constructor. Note that this is needed even | |
|                when the object just has a trivial default constructor */ | |
|             new (&p) Pickleable(t[0].cast<std::string>()); | |
| 
 | |
|             /* Assign any additional state */ | |
|             p.setExtra(t[1].cast<int>()); | |
|         }); | |
| 
 | |
| An instance can now be pickled as follows: | |
|  | |
| .. code-block:: python | |
| 
 | |
|     try: | |
|         import cPickle as pickle  # Use cPickle on Python 2.7 | |
|     except ImportError: | |
|         import pickle | |
| 
 | |
|     p = Pickleable("test_value") | |
|     p.setExtra(15) | |
|     data = pickle.dumps(p, -1) | |
| 
 | |
| Note that only the cPickle module is supported on Python 2.7. It is also | |
| important to request usage of the highest protocol version using the ``-1`` | |
| argument to ``dumps``. Failure to follow these two steps will lead to important | |
| pybind11 memory allocation routines to be skipped during unpickling, which will | |
| likely cause memory corruption and/or segmentation faults. | |
|  | |
| .. seealso:: | |
|  | |
|     The file :file:`example/example15.cpp` contains a complete example that | |
|     demonstrates how to pickle and unpickle types using pybind11 in more detail. | |
|  | |
| .. [#f2] http://docs.python.org/3/library/pickle.html#pickling-class-instances | |
|  | |
| Generating documentation using Sphinx | |
| ===================================== | |
|  | |
| Sphinx [#f3]_ has the ability to inspect the signatures and documentation | |
| strings in pybind11-based extension modules to automatically generate beautiful | |
| documentation in a variety formats. The pbtest repository [#f4]_ contains a | |
| simple example repository which uses this approach. | |
|  | |
| There are two potential gotchas when using this approach: first, make sure that | |
| the resulting strings do not contain any :kbd:`TAB` characters, which break the | |
| docstring parsing routines. You may want to use C++11 raw string literals, | |
| which are convenient for multi-line comments. Conveniently, any excess | |
| indentation will be automatically be removed by Sphinx. However, for this to | |
| work, it is important that all lines are indented consistently, i.e.: | |
|  | |
| .. code-block:: cpp | |
| 
 | |
|     // ok | |
|     m.def("foo", &foo, R"mydelimiter( | |
|         The foo function | |
| 
 | |
|         Parameters | |
|         ---------- | |
|     )mydelimiter"); | |
| 
 | |
|     // *not ok* | |
|     m.def("foo", &foo, R"mydelimiter(The foo function | |
| 
 | |
|         Parameters | |
|         ---------- | |
|     )mydelimiter"); | |
| 
 | |
| .. [#f3] http://www.sphinx-doc.org | |
| .. [#f4] http://github.com/pybind/pbtest | |
| 
 |