1STL containers 2############## 3 4Automatic conversion 5==================== 6 7When including the additional header file :file:`pybind11/stl.h`, conversions 8between ``std::vector<>``/``std::deque<>``/``std::list<>``/``std::array<>``/``std::valarray<>``, 9``std::set<>``/``std::unordered_set<>``, and 10``std::map<>``/``std::unordered_map<>`` and the Python ``list``, ``set`` and 11``dict`` data structures are automatically enabled. The types ``std::pair<>`` 12and ``std::tuple<>`` are already supported out of the box with just the core 13:file:`pybind11/pybind11.h` header. 14 15The major downside of these implicit conversions is that containers must be 16converted (i.e. copied) on every Python->C++ and C++->Python transition, which 17can have implications on the program semantics and performance. Please read the 18next sections for more details and alternative approaches that avoid this. 19 20.. note:: 21 22 Arbitrary nesting of any of these types is possible. 23 24.. seealso:: 25 26 The file :file:`tests/test_stl.cpp` contains a complete 27 example that demonstrates how to pass STL data types in more detail. 28 29.. _cpp17_container_casters: 30 31C++17 library containers 32======================== 33 34The :file:`pybind11/stl.h` header also includes support for ``std::optional<>`` 35and ``std::variant<>``. These require a C++17 compiler and standard library. 36In C++14 mode, ``std::experimental::optional<>`` is supported if available. 37 38Various versions of these containers also exist for C++11 (e.g. in Boost). 39pybind11 provides an easy way to specialize the ``type_caster`` for such 40types: 41 42.. code-block:: cpp 43 44 // `boost::optional` as an example -- can be any `std::optional`-like container 45 namespace pybind11 { namespace detail { 46 template <typename T> 47 struct type_caster<boost::optional<T>> : optional_caster<boost::optional<T>> {}; 48 }} 49 50The above should be placed in a header file and included in all translation units 51where automatic conversion is needed. Similarly, a specialization can be provided 52for custom variant types: 53 54.. code-block:: cpp 55 56 // `boost::variant` as an example -- can be any `std::variant`-like container 57 namespace pybind11 { namespace detail { 58 template <typename... Ts> 59 struct type_caster<boost::variant<Ts...>> : variant_caster<boost::variant<Ts...>> {}; 60 61 // Specifies the function used to visit the variant -- `apply_visitor` instead of `visit` 62 template <> 63 struct visit_helper<boost::variant> { 64 template <typename... Args> 65 static auto call(Args &&...args) -> decltype(boost::apply_visitor(args...)) { 66 return boost::apply_visitor(args...); 67 } 68 }; 69 }} // namespace pybind11::detail 70 71The ``visit_helper`` specialization is not required if your ``name::variant`` provides 72a ``name::visit()`` function. For any other function name, the specialization must be 73included to tell pybind11 how to visit the variant. 74 75.. warning:: 76 77 When converting a ``variant`` type, pybind11 follows the same rules as when 78 determining which function overload to call (:ref:`overload_resolution`), and 79 so the same caveats hold. In particular, the order in which the ``variant``'s 80 alternatives are listed is important, since pybind11 will try conversions in 81 this order. This means that, for example, when converting ``variant<int, bool>``, 82 the ``bool`` variant will never be selected, as any Python ``bool`` is already 83 an ``int`` and is convertible to a C++ ``int``. Changing the order of alternatives 84 (and using ``variant<bool, int>``, in this example) provides a solution. 85 86.. note:: 87 88 pybind11 only supports the modern implementation of ``boost::variant`` 89 which makes use of variadic templates. This requires Boost 1.56 or newer. 90 Additionally, on Windows, MSVC 2017 is required because ``boost::variant`` 91 falls back to the old non-variadic implementation on MSVC 2015. 92 93.. _opaque: 94 95Making opaque types 96=================== 97 98pybind11 heavily relies on a template matching mechanism to convert parameters 99and return values that are constructed from STL data types such as vectors, 100linked lists, hash tables, etc. This even works in a recursive manner, for 101instance to deal with lists of hash maps of pairs of elementary and custom 102types, etc. 103 104However, a fundamental limitation of this approach is that internal conversions 105between Python and C++ types involve a copy operation that prevents 106pass-by-reference semantics. What does this mean? 107 108Suppose we bind the following function 109 110.. code-block:: cpp 111 112 void append_1(std::vector<int> &v) { 113 v.push_back(1); 114 } 115 116and call it from Python, the following happens: 117 118.. code-block:: pycon 119 120 >>> v = [5, 6] 121 >>> append_1(v) 122 >>> print(v) 123 [5, 6] 124 125As you can see, when passing STL data structures by reference, modifications 126are not propagated back the Python side. A similar situation arises when 127exposing STL data structures using the ``def_readwrite`` or ``def_readonly`` 128functions: 129 130.. code-block:: cpp 131 132 /* ... definition ... */ 133 134 class MyClass { 135 std::vector<int> contents; 136 }; 137 138 /* ... binding code ... */ 139 140 py::class_<MyClass>(m, "MyClass") 141 .def(py::init<>()) 142 .def_readwrite("contents", &MyClass::contents); 143 144In this case, properties can be read and written in their entirety. However, an 145``append`` operation involving such a list type has no effect: 146 147.. code-block:: pycon 148 149 >>> m = MyClass() 150 >>> m.contents = [5, 6] 151 >>> print(m.contents) 152 [5, 6] 153 >>> m.contents.append(7) 154 >>> print(m.contents) 155 [5, 6] 156 157Finally, the involved copy operations can be costly when dealing with very 158large lists. To deal with all of the above situations, pybind11 provides a 159macro named ``PYBIND11_MAKE_OPAQUE(T)`` that disables the template-based 160conversion machinery of types, thus rendering them *opaque*. The contents of 161opaque objects are never inspected or extracted, hence they *can* be passed by 162reference. For instance, to turn ``std::vector<int>`` into an opaque type, add 163the declaration 164 165.. code-block:: cpp 166 167 PYBIND11_MAKE_OPAQUE(std::vector<int>); 168 169before any binding code (e.g. invocations to ``class_::def()``, etc.). This 170macro must be specified at the top level (and outside of any namespaces), since 171it adds a template instantiation of ``type_caster``. If your binding code consists of 172multiple compilation units, it must be present in every file (typically via a 173common header) preceding any usage of ``std::vector<int>``. Opaque types must 174also have a corresponding ``class_`` declaration to associate them with a name 175in Python, and to define a set of available operations, e.g.: 176 177.. code-block:: cpp 178 179 py::class_<std::vector<int>>(m, "IntVector") 180 .def(py::init<>()) 181 .def("clear", &std::vector<int>::clear) 182 .def("pop_back", &std::vector<int>::pop_back) 183 .def("__len__", [](const std::vector<int> &v) { return v.size(); }) 184 .def("__iter__", [](std::vector<int> &v) { 185 return py::make_iterator(v.begin(), v.end()); 186 }, py::keep_alive<0, 1>()) /* Keep vector alive while iterator is used */ 187 // .... 188 189.. seealso:: 190 191 The file :file:`tests/test_opaque_types.cpp` contains a complete 192 example that demonstrates how to create and expose opaque types using 193 pybind11 in more detail. 194 195.. _stl_bind: 196 197Binding STL containers 198====================== 199 200The ability to expose STL containers as native Python objects is a fairly 201common request, hence pybind11 also provides an optional header file named 202:file:`pybind11/stl_bind.h` that does exactly this. The mapped containers try 203to match the behavior of their native Python counterparts as much as possible. 204 205The following example showcases usage of :file:`pybind11/stl_bind.h`: 206 207.. code-block:: cpp 208 209 // Don't forget this 210 #include <pybind11/stl_bind.h> 211 212 PYBIND11_MAKE_OPAQUE(std::vector<int>); 213 PYBIND11_MAKE_OPAQUE(std::map<std::string, double>); 214 215 // ... 216 217 // later in binding code: 218 py::bind_vector<std::vector<int>>(m, "VectorInt"); 219 py::bind_map<std::map<std::string, double>>(m, "MapStringDouble"); 220 221When binding STL containers pybind11 considers the types of the container's 222elements to decide whether the container should be confined to the local module 223(via the :ref:`module_local` feature). If the container element types are 224anything other than already-bound custom types bound without 225``py::module_local()`` the container binding will have ``py::module_local()`` 226applied. This includes converting types such as numeric types, strings, Eigen 227types; and types that have not yet been bound at the time of the stl container 228binding. This module-local binding is designed to avoid potential conflicts 229between module bindings (for example, from two separate modules each attempting 230to bind ``std::vector<int>`` as a python type). 231 232It is possible to override this behavior to force a definition to be either 233module-local or global. To do so, you can pass the attributes 234``py::module_local()`` (to make the binding module-local) or 235``py::module_local(false)`` (to make the binding global) into the 236``py::bind_vector`` or ``py::bind_map`` arguments: 237 238.. code-block:: cpp 239 240 py::bind_vector<std::vector<int>>(m, "VectorInt", py::module_local(false)); 241 242Note, however, that such a global binding would make it impossible to load this 243module at the same time as any other pybind module that also attempts to bind 244the same container type (``std::vector<int>`` in the above example). 245 246See :ref:`module_local` for more details on module-local bindings. 247 248.. seealso:: 249 250 The file :file:`tests/test_stl_binders.cpp` shows how to use the 251 convenience STL container wrappers. 252