This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-3868-aa0a9115a67c7f0ddafa93f6373240067adf00e9 in repository https://gitbox.apache.org/repos/asf/iceberg-python.git
commit 747ebee2d065c5a293786cbede12ccc149544799 Author: hedger9487 <[email protected]> AuthorDate: Sat Oct 24 05:59:01 2026 +0000 feat: Support passing kwargs to polars.scan_iceberg in Table.to_polars (#3868) feat: Support passing kwargs to polars.scan_iceberg in Table.to_polars (#3128) Co-authored-by: Kevin Liu <[email protected]> --- pyiceberg/table/__init__.py | 10 +++++++--- tests/table/test_init.py | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/pyiceberg/table/__init__.py b/pyiceberg/table/__init__.py index 5f1341f0b..9c38da3b2 100644 --- a/pyiceberg/table/__init__.py +++ b/pyiceberg/table/__init__.py @@ -1900,15 +1900,19 @@ class Table: return bd.read_iceberg_table(self) - def to_polars(self) -> pl.LazyFrame: + def to_polars(self, **kwargs: Any) -> pl.LazyFrame: """Lazily read from this Apache Iceberg table. + Args: + **kwargs: Additional keyword arguments to forward to :func:`polars.scan_iceberg` + (e.g. ``storage_options``, ``snapshot_id``, ``reader_override``). + Returns: - pl.LazyFrame: Unmaterialized Polars LazyFrame created from the Iceberg table + pl.LazyFrame: Unmaterialized Polars LazyFrame created from the Iceberg table. """ import polars as pl - return pl.scan_iceberg(self) + return pl.scan_iceberg(self, **kwargs) def __datafusion_table_provider__(self, session: Any | None = None) -> IcebergDataFusionTable: """Return the DataFusion table provider PyCapsule interface. diff --git a/tests/table/test_init.py b/tests/table/test_init.py index 3d160781e..f4b63bc41 100644 --- a/tests/table/test_init.py +++ b/tests/table/test_init.py @@ -2067,3 +2067,29 @@ def test_static_table_forwards_location_to_table_file_io(metadata_location: str, assert seen_locations, "expected at least one load_file_io call" assert all(loc is not None for loc in seen_locations), f"load_file_io called without a location: {seen_locations}" + + +def test_table_to_polars_forwards_kwargs(table_v2: Table, monkeypatch: pytest.MonkeyPatch) -> None: + import polars as pl + + recorded_calls: list[tuple[Any, dict[str, Any]]] = [] + + def mock_scan_iceberg(source: Any, **kwargs: Any) -> Any: + recorded_calls.append((source, kwargs)) + return "mock_lazy_frame" + + monkeypatch.setattr(pl, "scan_iceberg", mock_scan_iceberg) + + # Test without kwargs + res1 = table_v2.to_polars() + assert res1 == "mock_lazy_frame" + assert recorded_calls[0] == (table_v2, {}) + + # Test with kwargs + storage_options = {"s3": {"endpoint": "https://s3.custom.endpoint"}} + res2 = table_v2.to_polars(storage_options=storage_options, snapshot_id=12345, reader_override="native") + assert res2 == "mock_lazy_frame" + assert recorded_calls[1] == ( + table_v2, + {"storage_options": storage_options, "snapshot_id": 12345, "reader_override": "native"}, + )
