[libcamera-devel] [PATCH v4 14/15] py: Improve stub type generation for PyCameraEvent

Tomi Valkeinen tomi.valkeinen at ideasonboard.com
Thu Mar 9 15:26:00 CET 2023


We store the camera, request and fb fields in PyCameraEvent as
py::objects, so that we keep the refs and keep-alives. When we
return py::objects to the Python side, they, obviously, show up
as "objects" when the stub generation is looking at the fields.

Fix this by manually casting the py::objects to the correct C++
counterparts, which causes pybind11 to assign the correct types for the
properties, helpind stubgen to generate correct types.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
---
 src/py/libcamera/py_main.cpp | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
index 1585b14a..cb7088b1 100644
--- a/src/py/libcamera/py_main.cpp
+++ b/src/py/libcamera/py_main.cpp
@@ -100,11 +100,19 @@ PYBIND11_MODULE(_libcamera, m)
 		.value("RequestCompleted", CameraEventType::RequestCompleted)
 		.value("BufferCompleted", CameraEventType::BufferCompleted);
 
+	/*
+	 * For camera, request and fb fields, manually typecast to the C++ type,
+	 * so that pybind11 assigns the actual type for the return value. This
+	 * makes the stubs generated by pybind11-stubgen contain the correct type,
+	 * instead of "object".
+	 *
+	 * Maybe there's a better way to do this...
+	 */
 	pyEvent
 		.def_readonly("type", &PyCameraEvent::type_)
-		.def_readonly("camera", &PyCameraEvent::camera_)
-		.def_readonly("request", &PyCameraEvent::request_)
-		.def_readonly("fb", &PyCameraEvent::fb_);
+		.def_property_readonly("camera", [](PyCameraEvent &self) { return self.camera_.cast<Camera *>(); })
+		.def_property_readonly("request", [](PyCameraEvent &self) { return self.request_.cast<Request *>(); })
+		.def_property_readonly("fb", [](PyCameraEvent &self) { return self.fb_.cast<FrameBuffer *>(); });
 
 	pyCameraManager
 		.def_static("singleton", []() {
-- 
2.34.1



More information about the libcamera-devel mailing list