diff --git a/py-polars/polars/functions/col.py b/py-polars/polars/functions/col.py index ff85be2019ce..5316e6f32f67 100644 --- a/py-polars/polars/functions/col.py +++ b/py-polars/polars/functions/col.py @@ -1,6 +1,7 @@ from __future__ import annotations import contextlib +import sys from collections.abc import Iterable from datetime import datetime, timedelta from typing import TYPE_CHECKING @@ -21,6 +22,9 @@ from polars._typing import PolarsDataType, PythonDataType from polars.expr.expr import Expr + if not sys.version_info >= (3, 11): + from typing import Any + __all__ = ["col"] @@ -362,5 +366,13 @@ def __getattr__(self, name: str) -> Expr: return _create_col(name) + if not sys.version_info >= (3, 11): + + def __getstate__(self) -> Any: + return self.__dict__ + + def __setstate__(self, state: Any) -> None: + self.__dict__ = state + col: Col = Col() diff --git a/py-polars/tests/unit/test_serde.py b/py-polars/tests/unit/test_serde.py index 7331089daa94..d15df29f51c9 100644 --- a/py-polars/tests/unit/test_serde.py +++ b/py-polars/tests/unit/test_serde.py @@ -225,3 +225,9 @@ def test_serde_empty_df_lazy_frame() -> None: f.write(lf.serialize()) f.seek(0) assert pl.LazyFrame.deserialize(f).collect().shape == (0, 0) + + +def test_pickle_class_objects_21021() -> None: + assert isinstance(pickle.loads(pickle.dumps(pl.col))("A"), pl.Expr) + assert isinstance(pickle.loads(pickle.dumps(pl.DataFrame))(), pl.DataFrame) + assert isinstance(pickle.loads(pickle.dumps(pl.LazyFrame))(), pl.LazyFrame)