Skip to content

Commit ec5dd0c

Browse files
committed
refactor: Reuse eager-backend iter_columns
Utilizing (#2115) and (#2104)
1 parent cbc1ee1 commit ec5dd0c

File tree

4 files changed

+14
-27
lines changed

4 files changed

+14
-27
lines changed

narwhals/_arrow/selectors.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
from __future__ import annotations
22

33
from typing import TYPE_CHECKING
4-
from typing import Iterator
54

65
from narwhals._arrow.expr import ArrowExpr
76
from narwhals._selectors import CompliantSelector
8-
from narwhals._selectors import CompliantSelectorNamespace
7+
from narwhals._selectors import EagerSelectorNamespace
98

109
if TYPE_CHECKING:
1110
from typing_extensions import Self
@@ -17,15 +16,7 @@
1716
from narwhals.utils import _FullContext
1817

1918

20-
class ArrowSelectorNamespace(CompliantSelectorNamespace["ArrowDataFrame", "ArrowSeries"]):
21-
def _iter_columns(self, df: ArrowDataFrame) -> Iterator[ArrowSeries]:
22-
from narwhals._arrow.series import ArrowSeries
23-
24-
for col, ser in zip(df.columns, df._native_frame.itercolumns()):
25-
yield ArrowSeries(
26-
ser, name=col, backend_version=df._backend_version, version=df._version
27-
)
28-
19+
class ArrowSelectorNamespace(EagerSelectorNamespace["ArrowDataFrame", "ArrowSeries"]):
2920
def _selector(
3021
self,
3122
call: EvalSeries[ArrowDataFrame, ArrowSeries],

narwhals/_pandas_like/selectors.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
from __future__ import annotations
22

3-
from functools import partial
43
from typing import TYPE_CHECKING
5-
from typing import Iterator
64

75
from narwhals._pandas_like.dataframe import PandasLikeDataFrame
86
from narwhals._pandas_like.expr import PandasLikeExpr
97
from narwhals._pandas_like.series import PandasLikeSeries
108
from narwhals._selectors import CompliantSelector
11-
from narwhals._selectors import CompliantSelectorNamespace
9+
from narwhals._selectors import EagerSelectorNamespace
1210

1311
if TYPE_CHECKING:
1412
from typing_extensions import Self
@@ -21,20 +19,8 @@
2119

2220

2321
class PandasSelectorNamespace(
24-
CompliantSelectorNamespace["PandasLikeDataFrame", "PandasLikeSeries"]
22+
EagerSelectorNamespace["PandasLikeDataFrame", "PandasLikeSeries"]
2523
):
26-
def _iter_columns(self, df: PandasLikeDataFrame) -> Iterator[PandasLikeSeries]:
27-
from narwhals._pandas_like.series import PandasLikeSeries
28-
29-
series = partial(
30-
PandasLikeSeries,
31-
implementation=df._implementation,
32-
backend_version=df._backend_version,
33-
version=df._version,
34-
)
35-
for _col, ser in df._native_frame.items(): # noqa: PERF102
36-
yield series(ser)
37-
3824
def _selector(
3925
self,
4026
call: EvalSeries[PandasLikeDataFrame, PandasLikeSeries],

narwhals/_selectors.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
SeriesT = TypeVar("SeriesT", bound="CompliantSeries")
5454
FrameT = TypeVar("FrameT", bound="CompliantDataFrame[Any] | CompliantLazyFrame")
55+
DataFrameT = TypeVar("DataFrameT", bound="CompliantDataFrame[Any]")
5556
SelectorOrExpr: TypeAlias = (
5657
"CompliantSelector[FrameT, SeriesT] | CompliantExpr[FrameT, SeriesT]"
5758
)
@@ -168,6 +169,13 @@ def names(df: FrameT) -> Sequence[str]:
168169
return self._selector(series, names)
169170

170171

172+
class EagerSelectorNamespace(
173+
CompliantSelectorNamespace[DataFrameT, SeriesT], Protocol[DataFrameT, SeriesT]
174+
):
175+
def _iter_columns(self, df: DataFrameT, /) -> Iterator[SeriesT]:
176+
yield from df.iter_columns()
177+
178+
171179
class LazySelectorNamespace(
172180
CompliantSelectorNamespace[FrameT, SeriesT], Protocol[FrameT, SeriesT]
173181
):

narwhals/typing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import TYPE_CHECKING
44
from typing import Any
55
from typing import Callable
6+
from typing import Iterator
67
from typing import Literal
78
from typing import Protocol
89
from typing import Sequence
@@ -83,6 +84,7 @@ def columns(self) -> Sequence[str]: ...
8384
@property
8485
def schema(self) -> Mapping[str, DType]: ...
8586
def get_column(self, name: str) -> CompliantSeriesT_co: ...
87+
def iter_columns(self) -> Iterator[CompliantSeriesT_co]: ...
8688

8789

8890
class CompliantLazyFrame(Protocol):

0 commit comments

Comments
 (0)