Skip to content

Commit 636fe40

Browse files
authored
chore: Deprecate native_namespace in favour of backend in scan_csv (#2218)
- Related issue #1888
1 parent c14f43b commit 636fe40

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

narwhals/functions.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -840,8 +840,13 @@ def _read_csv_impl(
840840
return from_native(native_frame, eager_only=True)
841841

842842

843+
@deprecate_native_namespace(warn_version="1.31.0", required=True)
843844
def scan_csv(
844-
source: str, *, native_namespace: ModuleType, **kwargs: Any
845+
source: str,
846+
*,
847+
backend: ModuleType | Implementation | str | None = None,
848+
native_namespace: ModuleType | None = None, # noqa: ARG001
849+
**kwargs: Any,
845850
) -> LazyFrame[Any]:
846851
"""Lazily read from a CSV file.
847852
@@ -850,10 +855,22 @@ def scan_csv(
850855
851856
Arguments:
852857
source: Path to a file.
858+
backend: The eager backend for DataFrame creation.
859+
`backend` can be specified in various ways:
860+
861+
- As `Implementation.<BACKEND>` with `BACKEND` being `PANDAS`, `PYARROW`,
862+
`POLARS`, `MODIN` or `CUDF`.
863+
- As a string: `"pandas"`, `"pyarrow"`, `"polars"`, `"modin"` or `"cudf"`.
864+
- Directly as a module `pandas`, `pyarrow`, `polars`, `modin` or `cudf`.
853865
native_namespace: The native library to use for DataFrame creation.
866+
867+
**Deprecated** (v1.31.0):
868+
Please use `backend` instead. Note that `native_namespace` is still available
869+
(and won't emit a deprecation warning) if you use `narwhals.stable.v1`,
870+
see [perfect backwards compatibility policy](../backcompat.md/).
854871
kwargs: Extra keyword arguments which are passed to the native CSV reader.
855872
For example, you could use
856-
`nw.scan_csv('file.csv', native_namespace=pd, engine='pyarrow')`.
873+
`nw.scan_csv('file.csv', backend=pd, engine='pyarrow')`.
857874
858875
Returns:
859876
LazyFrame.
@@ -862,7 +879,7 @@ def scan_csv(
862879
>>> import duckdb
863880
>>> import narwhals as nw
864881
>>>
865-
>>> nw.scan_csv("file.csv", native_namespace=duckdb).to_native() # doctest:+SKIP
882+
>>> nw.scan_csv("file.csv", backend="duckdb").to_native() # doctest:+SKIP
866883
┌─────────┬───────┐
867884
│ a │ b │
868885
│ varchar │ int32 │
@@ -872,13 +889,15 @@ def scan_csv(
872889
│ z │ 3 │
873890
└─────────┴───────┘
874891
"""
875-
return _scan_csv_impl(source, native_namespace=native_namespace, **kwargs)
892+
backend = cast("ModuleType | Implementation | str", backend)
893+
return _scan_csv_impl(source, backend=backend, **kwargs)
876894

877895

878896
def _scan_csv_impl(
879-
source: str, *, native_namespace: ModuleType, **kwargs: Any
897+
source: str, *, backend: ModuleType | Implementation | str, **kwargs: Any
880898
) -> LazyFrame[Any]:
881-
implementation = Implementation.from_native_namespace(native_namespace)
899+
implementation = Implementation.from_backend(backend)
900+
native_namespace = implementation.to_native_namespace()
882901
native_frame: NativeFrame | NativeLazyFrame
883902
if implementation is Implementation.POLARS:
884903
native_frame = native_namespace.scan_csv(source, **kwargs)

narwhals/stable/v1/__init__.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,8 +2359,13 @@ def read_csv(
23592359
)
23602360

23612361

2362+
@deprecate_native_namespace(required=True)
23622363
def scan_csv(
2363-
source: str, *, native_namespace: ModuleType, **kwargs: Any
2364+
source: str,
2365+
*,
2366+
backend: ModuleType | Implementation | str | None = None,
2367+
native_namespace: ModuleType | None = None, # noqa: ARG001
2368+
**kwargs: Any,
23642369
) -> LazyFrame[Any]:
23652370
"""Lazily read from a CSV file.
23662371
@@ -2369,16 +2374,29 @@ def scan_csv(
23692374
23702375
Arguments:
23712376
source: Path to a file.
2377+
backend: The eager backend for DataFrame creation.
2378+
`backend` can be specified in various ways:
2379+
2380+
- As `Implementation.<BACKEND>` with `BACKEND` being `PANDAS`, `PYARROW`,
2381+
`POLARS`, `MODIN` or `CUDF`.
2382+
- As a string: `"pandas"`, `"pyarrow"`, `"polars"`, `"modin"` or `"cudf"`.
2383+
- Directly as a module `pandas`, `pyarrow`, `polars`, `modin` or `cudf`.
23722384
native_namespace: The native library to use for DataFrame creation.
2385+
2386+
**Deprecated** (v1.31.0):
2387+
Please use `backend` instead. Note that `native_namespace` is still available
2388+
(and won't emit a deprecation warning) if you use `narwhals.stable.v1`,
2389+
see [perfect backwards compatibility policy](../backcompat.md/).
23732390
kwargs: Extra keyword arguments which are passed to the native CSV reader.
23742391
For example, you could use
2375-
`nw.scan_csv('file.csv', native_namespace=pd, engine='pyarrow')`.
2392+
`nw.scan_csv('file.csv', backend=pd, engine='pyarrow')`.
23762393
23772394
Returns:
23782395
LazyFrame.
23792396
"""
2397+
backend = cast("ModuleType | Implementation | str", backend)
23802398
return _stableify( # type: ignore[no-any-return]
2381-
_scan_csv_impl(source, native_namespace=native_namespace, **kwargs)
2399+
_scan_csv_impl(source, backend=backend, **kwargs)
23822400
)
23832401

23842402

tests/read_scan_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ def test_scan_csv(
7777
filepath = str(tmpdir / "file.csv") # type: ignore[operator]
7878
df_pl.write_csv(filepath)
7979
df = nw.from_native(constructor(data))
80-
native_namespace = nw.get_native_namespace(df)
81-
result = nw.scan_csv(filepath, native_namespace=native_namespace)
80+
backend = nw.get_native_namespace(df)
81+
result = nw.scan_csv(filepath, backend=backend)
8282
assert_equal_data(result, data)
8383
assert isinstance(result, nw.LazyFrame)
8484

@@ -94,8 +94,8 @@ def test_scan_csv_v1(
9494
filepath = str(tmpdir / "file.csv") # type: ignore[operator]
9595
df_pl.write_csv(filepath)
9696
df = nw_v1.from_native(constructor(data))
97-
native_namespace = nw_v1.get_native_namespace(df)
98-
result = nw_v1.scan_csv(filepath, native_namespace=native_namespace)
97+
backend = nw_v1.get_native_namespace(df)
98+
result = nw_v1.scan_csv(filepath, backend=backend)
9999
assert_equal_data(result, data)
100100
assert isinstance(result, nw_v1.LazyFrame)
101101

@@ -105,7 +105,7 @@ def test_scan_csv_kwargs(tmpdir: pytest.TempdirFactory) -> None:
105105
df_pl = pl.DataFrame(data)
106106
filepath = str(tmpdir / "file.csv") # type: ignore[operator]
107107
df_pl.write_csv(filepath)
108-
result = nw.scan_csv(filepath, native_namespace=pd, engine="pyarrow")
108+
result = nw.scan_csv(filepath, backend=pd, engine="pyarrow")
109109
assert_equal_data(result, data)
110110

111111

0 commit comments

Comments
 (0)