From f68ab481ba0020cabec57ac957d0aa3f72e653c6 Mon Sep 17 00:00:00 2001 From: R2D2 Date: Thu, 27 May 2021 15:42:57 +0200 Subject: [PATCH] Added improved error messages to the derive FromPyObject macro for basic structs and enums --- pyo3-macros-backend/src/from_pyobject.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/pyo3-macros-backend/src/from_pyobject.rs b/pyo3-macros-backend/src/from_pyobject.rs index ed0c6387..79e2d4b9 100644 --- a/pyo3-macros-backend/src/from_pyobject.rs +++ b/pyo3-macros-backend/src/from_pyobject.rs @@ -77,7 +77,10 @@ impl<'a> Enum<'a> { quote!( #(#var_extracts)* let type_name = obj.get_type().name()?; - let err_msg = format!("'{}' object cannot be converted to '{}'", type_name, #error_names); + let err_msg = format!("In {} : '{}' object cannot be converted to '{}'", + self.enum_ident, + type_name, + #error_names); Err(pyo3::exceptions::PyTypeError::new_err(err_msg)) ) } @@ -241,8 +244,21 @@ impl<'a> Container<'a> { let get_field = quote!(obj.#getter?); let extractor = match &attrs.from_py_with { - None => quote!(#get_field.extract()?), - Some(FromPyWithAttribute(expr_path)) => quote! (#expr_path(#get_field)?), + None => quote!(#get_field.extract().map_err(|inner| { + let err_msg = format!("Failed to extract field {} of {}:\n{} ", + stringify!(#ident), + stringify!(#self_ty), + inner); + pyo3::exceptions::PyTypeError::new_err(err_msg) + })?), + Some(FromPyWithAttribute(expr_path)) => quote! (#expr_path(#get_field). + map_err(|inner| { + let err_msg = format!("Failed to extract field {} of {}:\n{} ", + stringify!(#ident), + stringify!(#self_ty), + inner); + pyo3::exceptions::PyTypeError::new_err(err_msg) + })?), }; fields.push(quote!(#ident: #extractor));