Path: blob/main/crates/polars-python/src/interop/arrow/mod.rs
7889 views
use polars::prelude::{ArrowDataType, DataType};1use polars_error::polars_err;2use pyo3::exceptions::PyValueError;3use pyo3::types::{PyAnyMethods, PyTuple};4use pyo3::{Bound, IntoPyObject, PyAny, PyResult, intern, pyfunction};56use crate::prelude::Wrap;7use crate::series::import_schema_pycapsule;8use crate::utils::to_py_err;910pub mod to_py;11pub mod to_rust;1213#[pyfunction]14pub fn init_polars_schema_from_arrow_c_schema(15polars_schema: Bound<PyAny>,16schema_object: Bound<PyAny>,17) -> PyResult<()> {18let py = polars_schema.py();1920let schema_capsule = schema_object21.getattr(intern!(py, "__arrow_c_schema__"))?22.call0()?;2324let field = import_schema_pycapsule(&schema_capsule.extract()?)?;2526let ArrowDataType::Struct(fields) = field.dtype else {27return Err(PyValueError::new_err(format!(28"__arrow_c_schema__ of object passed to pl.Schema did not return struct dtype: \29object: {}, dtype: {:?}",30schema_object, &field.dtype31)));32};3334for field in fields {35let dtype = DataType::from_arrow_field(&field);3637let name = field.name.into_pyobject(py)?;38let dtype = Wrap(dtype).into_pyobject(py)?;3940if polars_schema.contains(&name)? {41return Err(to_py_err(polars_err!(42Duplicate:43"arrow schema contained duplicate name: {}",44name45)));46}4748polars_schema.set_item(name, dtype)?;49}5051Ok(())52}5354#[pyfunction]55pub fn polars_schema_field_from_arrow_c_schema(56schema_object: Bound<PyAny>,57) -> PyResult<Bound<PyTuple>> {58let py = schema_object.py();5960let schema_capsule = schema_object61.getattr(intern!(py, "__arrow_c_schema__"))?62.call0()?;6364let field = import_schema_pycapsule(&schema_capsule.extract()?)?;65let dtype = DataType::from_arrow_field(&field);6667let name = field.name.into_pyobject(py)?.into_any();68let dtype = Wrap(dtype).into_pyobject(py)?.into_any();6970PyTuple::new(py, [name, dtype])71}727374