From 1843ff20fdb78d308c055a9dea368242499f1914 Mon Sep 17 00:00:00 2001 From: R2D2 Date: Fri, 28 May 2021 00:38:32 +0200 Subject: [PATCH] Added support for enhanced errors for the FromPyObject trait derived on tuples and newtype structs/tuples --- pyo3-macros-backend/src/from_pyobject.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pyo3-macros-backend/src/from_pyobject.rs b/pyo3-macros-backend/src/from_pyobject.rs index 4c2b43ab..355218c2 100644 --- a/pyo3-macros-backend/src/from_pyobject.rs +++ b/pyo3-macros-backend/src/from_pyobject.rs @@ -200,10 +200,21 @@ impl<'a> Container<'a> { let self_ty = &self.path; if let Some(ident) = field_ident { quote!( - Ok(#self_ty{#ident: obj.extract()?}) + Ok(#self_ty{#ident: obj.extract().map_err(|inner| { + let err_msg = format!("failed to extract field {}.{}\n\nCaused by:\n {}\n", + stringify!(#self_ty), + stringify!(#ident), + inner); + pyo3::exceptions::PyTypeError::new_err(err_msg) + })?}) ) } else { - quote!(Ok(#self_ty(obj.extract()?))) + quote!(Ok(#self_ty(obj.extract().map_err(|inner| { + let err_msg = format!("failed to extract inner field of {}\n\nCaused by:\n {}\n", + stringify!(#self_ty), + inner); + pyo3::exceptions::PyTypeError::new_err(err_msg) + })?))) } } @@ -211,7 +222,13 @@ impl<'a> Container<'a> { let self_ty = &self.path; let mut fields: Punctuated = Punctuated::new(); for i in 0..len { - fields.push(quote!(s.get_item(#i).extract()?)); + fields.push(quote!(s.get_item(#i).extract().map_err(|inner| { + let err_msg = format!("failed to extract field {}.{}\n\nCaused by:\n {}\n", + stringify!(#self_ty), + #i, + inner); + pyo3::exceptions::PyTypeError::new_err(err_msg) + })?)); } let msg = if self.is_enum_variant { quote!(format!(