diff --git a/py-polars/polars/_utils/construction/dataframe.py b/py-polars/polars/_utils/construction/dataframe.py index 81f100b12ffd..4e231e7a5028 100644 --- a/py-polars/polars/_utils/construction/dataframe.py +++ b/py-polars/polars/_utils/construction/dataframe.py @@ -555,7 +555,7 @@ def _sequence_of_sequence_to_pydf( if unpack_nested: dicts = [nt_unpack(d) for d in data] pydf = PyDataFrame.from_dicts( - dicts, infer_schema_length=infer_schema_length + dicts, strict=strict, infer_schema_length=infer_schema_length ) else: pydf = PyDataFrame.from_rows( @@ -675,6 +675,7 @@ def _sequence_of_dict_to_pydf( data, dicts_schema, schema_overrides, + strict=strict, infer_schema_length=infer_schema_length, ) @@ -774,7 +775,9 @@ def _sequence_of_dataclasses_to_pydf( ) if unpack_nested: dicts = [asdict(md) for md in data] - pydf = PyDataFrame.from_dicts(dicts, infer_schema_length=infer_schema_length) + pydf = PyDataFrame.from_dicts( + dicts, strict=strict, infer_schema_length=infer_schema_length + ) else: rows = [astuple(dc) for dc in data] pydf = PyDataFrame.from_rows( @@ -823,7 +826,9 @@ def _sequence_of_pydantic_models_to_pydf( if old_pydantic else [md.model_dump(mode="python") for md in data] ) - pydf = PyDataFrame.from_dicts(dicts, infer_schema_length=infer_schema_length) + pydf = PyDataFrame.from_dicts( + dicts, strict=strict, infer_schema_length=infer_schema_length + ) elif len(model_fields) > 50: # 'from_rows' is the faster codepath for models with a lot of fields... @@ -836,7 +841,10 @@ def _sequence_of_pydantic_models_to_pydf( # ...and 'from_dicts' is faster otherwise dicts = [md.__dict__ for md in data] pydf = PyDataFrame.from_dicts( - dicts, schema=overrides, infer_schema_length=infer_schema_length + dicts, + schema=overrides, + strict=strict, + infer_schema_length=infer_schema_length, ) if overrides: diff --git a/py-polars/src/dataframe/construction.rs b/py-polars/src/dataframe/construction.rs index d3cd40bc1e0b..723d02919af5 100644 --- a/py-polars/src/dataframe/construction.rs +++ b/py-polars/src/dataframe/construction.rs @@ -21,19 +21,20 @@ impl PyDataFrame { } #[staticmethod] - #[pyo3(signature = (data, schema=None, schema_overrides=None, infer_schema_length=None))] + #[pyo3(signature = (data, schema=None, schema_overrides=None, strict=true, infer_schema_length=None))] pub fn from_dicts( py: Python, data: &PyAny, schema: Option>, schema_overrides: Option>, + strict: bool, infer_schema_length: Option, ) -> PyResult { let schema = schema.map(|wrap| wrap.0); let schema_overrides = schema_overrides.map(|wrap| wrap.0); let names = get_schema_names(data, schema.as_ref(), infer_schema_length)?; - let rows = dicts_to_rows(data, &names)?; + let rows = dicts_to_rows(data, &names, strict)?; let schema = schema.or_else(|| { Some(columns_names_to_empty_schema( @@ -134,7 +135,7 @@ where Schema::from_iter(fields) } -fn dicts_to_rows<'a>(data: &'a PyAny, names: &'a [String]) -> PyResult>> { +fn dicts_to_rows<'a>(data: &'a PyAny, names: &'a [String], strict: bool) -> PyResult>> { let len = data.len()?; let mut rows = Vec::with_capacity(len); for d in data.iter()? { @@ -145,9 +146,7 @@ fn dicts_to_rows<'a>(data: &'a PyAny, names: &'a [String]) -> PyResult AnyValue::Null, - // TODO: Propagate strictness here. - // https://github.com/pola-rs/polars/issues/14427 - Some(val) => py_object_to_any_value(val, false)?, + Some(val) => py_object_to_any_value(val, strict)?, }; row.push(val) }