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.
		
		
		
		
		
			
		
			
				
					
					
						
							98 lines
						
					
					
						
							2.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							98 lines
						
					
					
						
							2.9 KiB
						
					
					
				
								Python types
							 | 
						|
								############
							 | 
						|
								
							 | 
						|
								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`.
							 | 
						|
								
							 | 
						|
								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`.
							 | 
						|
								
							 | 
						|
								.. _calling_python_functions:
							 | 
						|
								
							 | 
						|
								Calling Python functions
							 | 
						|
								========================
							 | 
						|
								
							 | 
						|
								It is also possible to call python functions via ``operator()``.
							 | 
						|
								
							 | 
						|
								.. code-block:: cpp
							 | 
						|
								
							 | 
						|
								    py::function f = <...>;
							 | 
						|
								    py::object result_py = f(1234, "hello", some_instance);
							 | 
						|
								    MyClass &result = result_py.cast<MyClass>();
							 | 
						|
								
							 | 
						|
								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 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/
							 |