kylebarron commented on code in PR #5070: URL: https://github.com/apache/arrow-rs/pull/5070#discussion_r1391286531
########## arrow/src/pyarrow.rs: ########## @@ -189,6 +244,29 @@ impl ToPyArrow for Schema { impl FromPyArrow for ArrayData { fn from_pyarrow(value: &PyAny) -> PyResult<Self> { + // Newer versions of PyArrow as well as other libraries with Arrow data implement this + // method, so prefer it over _export_to_c. + if value.hasattr("__arrow_c_array__")? { + let tuple = value.getattr("__arrow_c_array__")?.call0()?; + + if !tuple.is_instance_of::<PyTuple>() { + return Err(PyTypeError::new_err( + "Expected __arrow_c_array__ to return a tuple.", + )); + } + + let schema_capsule: &PyCapsule = PyTryInto::try_into(tuple.get_item(0)?)?; + let array_capsule: &PyCapsule = PyTryInto::try_into(tuple.get_item(1)?)?; + + validate_pycapsule(schema_capsule, "arrow_schema")?; + validate_pycapsule(array_capsule, "arrow_array")?; + + let schema_ptr = unsafe { schema_capsule.reference::<FFI_ArrowSchema>() }; + let array_ptr = unsafe { array_capsule.reference::<FFI_ArrowArray>() }; + + return ffi::from_ffi(array_ptr.copy(), schema_ptr).map_err(to_py_err); Review Comment: Oh interesting, I didn't know about `std::mem::replace` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org