Skip to content

Commit 9acfd4e

Browse files
committed
refactor: Replace imports from typing
1 parent 9584778 commit 9acfd4e

File tree

7 files changed

+36
-53
lines changed

7 files changed

+36
-53
lines changed

narwhals/_compliant/typing.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
from narwhals._compliant.namespace import CompliantNamespace, EagerNamespace
2424
from narwhals._compliant.series import CompliantSeries, EagerSeries
2525
from narwhals._compliant.window import WindowInputs
26+
from narwhals._native import NativeDataFrame, NativeFrame, NativeSeries
2627
from narwhals.typing import (
2728
FillNullStrategy,
2829
IntoLazyFrame,
2930
ModeKeepStrategy,
30-
NativeDataFrame,
31-
NativeFrame,
32-
NativeSeries,
3331
RankMethod,
3432
RollingInterpolationMethod,
3533
)

narwhals/functions.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from typing_extensions import TypeAlias, TypeIs
4242

4343
from narwhals._compliant import CompliantExpr, CompliantNamespace
44+
from narwhals._native import NativeDataFrame, NativeLazyFrame, NativeSeries
4445
from narwhals._translate import IntoArrowTable
4546
from narwhals._typing import Backend, EagerAllowed, IntoBackend
4647
from narwhals.dataframe import DataFrame, LazyFrame
@@ -50,9 +51,6 @@
5051
IntoDType,
5152
IntoExpr,
5253
IntoSchema,
53-
NativeDataFrame,
54-
NativeLazyFrame,
55-
NativeSeries,
5654
NonNestedLiteral,
5755
_1DArray,
5856
_2DArray,

narwhals/typing.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
if TYPE_CHECKING:
1010
import datetime as dt
11-
from collections.abc import Iterable, Sequence, Sized
11+
from collections.abc import Sequence
1212
from decimal import Decimal
1313
from types import ModuleType
1414

@@ -19,29 +19,17 @@
1919
from typing_extensions import TypeAlias
2020

2121
from narwhals import dtypes
22-
from narwhals._native import NativeIbis
22+
from narwhals._native import (
23+
NativeDataFrame,
24+
NativeIbis,
25+
NativeLazyFrame,
26+
NativeSeries,
27+
)
2328
from narwhals.dataframe import DataFrame, LazyFrame
2429
from narwhals.expr import Expr
2530
from narwhals.schema import Schema
2631
from narwhals.series import Series
2732

28-
# All dataframes supported by Narwhals have a
29-
# `columns` property. Their similarities don't extend
30-
# _that_ much further unfortunately...
31-
class NativeFrame(Protocol):
32-
@property
33-
def columns(self) -> Any: ...
34-
35-
def join(self, *args: Any, **kwargs: Any) -> Any: ...
36-
37-
class NativeDataFrame(Sized, NativeFrame, Protocol): ...
38-
39-
class NativeLazyFrame(NativeFrame, Protocol):
40-
def explain(self, *args: Any, **kwargs: Any) -> Any: ...
41-
42-
class NativeSeries(Sized, Iterable[Any], Protocol):
43-
def filter(self, *args: Any, **kwargs: Any) -> Any: ...
44-
4533
class SupportsNativeNamespace(Protocol):
4634
def __native_namespace__(self) -> ModuleType: ...
4735

tests/conftest.py

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,16 @@
1515
if TYPE_CHECKING:
1616
from collections.abc import Sequence
1717

18-
import duckdb
1918
import ibis
2019
import pandas as pd
2120
import polars as pl
2221
import pyarrow as pa
2322
from ibis.backends.duckdb import Backend as IbisDuckDBBackend
24-
from pyspark.sql import DataFrame as PySparkDataFrame
2523
from typing_extensions import TypeAlias
2624

27-
from narwhals._spark_like.dataframe import SQLFrameDataFrame
25+
from narwhals._native import NativeDask, NativeDuckDB, NativePySpark, NativeSQLFrame
2826
from narwhals._typing import EagerAllowed
29-
from narwhals.typing import NativeDataFrame, NativeLazyFrame
27+
from narwhals.typing import IntoDataFrame
3028
from tests.utils import Constructor, ConstructorEager, ConstructorLazy
3129

3230
Data: TypeAlias = "dict[str, list[Any]]"
@@ -100,27 +98,27 @@ def pandas_pyarrow_constructor(obj: Data) -> pd.DataFrame:
10098
return pd.DataFrame(obj).convert_dtypes(dtype_backend="pyarrow")
10199

102100

103-
def modin_constructor(obj: Data) -> NativeDataFrame: # pragma: no cover
101+
def modin_constructor(obj: Data) -> IntoDataFrame: # pragma: no cover
104102
import modin.pandas as mpd
105103
import pandas as pd
106104

107105
df = mpd.DataFrame(pd.DataFrame(obj))
108-
return cast("NativeDataFrame", df)
106+
return cast("IntoDataFrame", df)
109107

110108

111-
def modin_pyarrow_constructor(obj: Data) -> NativeDataFrame: # pragma: no cover
109+
def modin_pyarrow_constructor(obj: Data) -> IntoDataFrame: # pragma: no cover
112110
import modin.pandas as mpd
113111
import pandas as pd
114112

115113
df = mpd.DataFrame(pd.DataFrame(obj)).convert_dtypes(dtype_backend="pyarrow")
116-
return cast("NativeDataFrame", df)
114+
return cast("IntoDataFrame", df)
117115

118116

119-
def cudf_constructor(obj: Data) -> NativeDataFrame: # pragma: no cover
117+
def cudf_constructor(obj: Data) -> IntoDataFrame: # pragma: no cover
120118
import cudf
121119

122120
df = cudf.DataFrame(obj)
123-
return cast("NativeDataFrame", df)
121+
return cast("IntoDataFrame", df)
124122

125123

126124
def polars_eager_constructor(obj: Data) -> pl.DataFrame:
@@ -135,7 +133,7 @@ def polars_lazy_constructor(obj: Data) -> pl.LazyFrame:
135133
return pl.LazyFrame(obj)
136134

137135

138-
def duckdb_lazy_constructor(obj: Data) -> duckdb.DuckDBPyRelation:
136+
def duckdb_lazy_constructor(obj: Data) -> NativeDuckDB:
139137
import duckdb
140138
import polars as pl
141139

@@ -145,16 +143,16 @@ def duckdb_lazy_constructor(obj: Data) -> duckdb.DuckDBPyRelation:
145143
return duckdb.table("_df")
146144

147145

148-
def dask_lazy_p1_constructor(obj: Data) -> NativeLazyFrame: # pragma: no cover
146+
def dask_lazy_p1_constructor(obj: Data) -> NativeDask: # pragma: no cover
149147
import dask.dataframe as dd
150148

151-
return cast("NativeLazyFrame", dd.from_dict(obj, npartitions=1))
149+
return cast("NativeDask", dd.from_dict(obj, npartitions=1))
152150

153151

154-
def dask_lazy_p2_constructor(obj: Data) -> NativeLazyFrame: # pragma: no cover
152+
def dask_lazy_p2_constructor(obj: Data) -> NativeDask: # pragma: no cover
155153
import dask.dataframe as dd
156154

157-
return cast("NativeLazyFrame", dd.from_dict(obj, npartitions=2))
155+
return cast("NativeDask", dd.from_dict(obj, npartitions=2))
158156

159157

160158
def pyarrow_table_constructor(obj: dict[str, Any]) -> pa.Table:
@@ -163,7 +161,7 @@ def pyarrow_table_constructor(obj: dict[str, Any]) -> pa.Table:
163161
return pa.table(obj)
164162

165163

166-
def pyspark_lazy_constructor() -> Callable[[Data], PySparkDataFrame]: # pragma: no cover
164+
def pyspark_lazy_constructor() -> Callable[[Data], NativePySpark]: # pragma: no cover
167165
pytest.importorskip("pyspark")
168166
import warnings
169167
from atexit import register
@@ -178,22 +176,22 @@ def pyspark_lazy_constructor() -> Callable[[Data], PySparkDataFrame]: # pragma:
178176

179177
register(session.stop)
180178

181-
def _constructor(obj: Data) -> PySparkDataFrame:
179+
def _constructor(obj: Data) -> NativePySpark:
182180
_obj = deepcopy(obj)
183181
index_col_name = generate_temporary_column_name(n_bytes=8, columns=list(_obj))
184182
_obj[index_col_name] = list(range(len(_obj[next(iter(_obj))])))
185-
186-
return (
183+
result = (
187184
session.createDataFrame([*zip(*_obj.values())], schema=[*_obj.keys()])
188185
.repartition(2)
189186
.orderBy(index_col_name)
190187
.drop(index_col_name)
191188
)
189+
return cast("NativePySpark", result)
192190

193191
return _constructor
194192

195193

196-
def sqlframe_pyspark_lazy_constructor(obj: Data) -> SQLFrameDataFrame: # pragma: no cover
194+
def sqlframe_pyspark_lazy_constructor(obj: Data) -> NativeSQLFrame: # pragma: no cover
197195
session = sqlframe_session()
198196
return session.createDataFrame([*zip(*obj.values())], schema=[*obj.keys()])
199197

tests/expr_and_series/cast_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818

1919
if TYPE_CHECKING:
20-
from narwhals.typing import NativeLazyFrame
20+
from narwhals._native import NativeSQLFrame
2121

2222
DATA = {
2323
"a": [1],
@@ -282,12 +282,12 @@ def test_cast_struct(request: pytest.FixtureRequest, constructor: Constructor) -
282282
if "spark" in str(constructor): # pragma: no cover
283283
# Special handling for pyspark as it natively maps the input to
284284
# a column of type MAP<STRING, STRING>
285-
native_ldf = cast("NativeLazyFrame", native_df)
285+
native_ldf = cast("NativeSQLFrame", native_df)
286286
_tmp_nw_compliant_frame = nw.from_native(native_ldf)._compliant_frame
287287
F = _tmp_nw_compliant_frame._F # type: ignore[attr-defined]
288288
T = _tmp_nw_compliant_frame._native_dtypes # type: ignore[attr-defined] # noqa: N806
289289

290-
native_ldf = native_ldf.withColumn( # type: ignore[attr-defined]
290+
native_ldf = native_ldf.withColumn(
291291
"a",
292292
F.struct(
293293
F.col("a.movie ").cast(T.StringType()).alias("movie "),

tests/frame/join_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
)
1818

1919
if TYPE_CHECKING:
20-
from narwhals.typing import IntoLazyFrameT, JoinStrategy, NativeDataFrame
20+
from narwhals.typing import IntoDataFrame, IntoLazyFrameT, JoinStrategy
2121

2222

2323
def from_native_lazy(
24-
native: IntoLazyFrameT | NativeDataFrame,
24+
native: IntoLazyFrameT | IntoDataFrame,
2525
) -> nw.LazyFrame[IntoLazyFrameT] | nw.LazyFrame[Any]:
2626
"""Every join test [needs to use `.lazy()` for typing]*.
2727

tests/utils.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
from sqlframe.duckdb import DuckDBSession
2323
from typing_extensions import TypeAlias
2424

25-
from narwhals.typing import Frame, NativeDataFrame, NativeLazyFrame
25+
from narwhals._native import NativeLazyFrame
26+
from narwhals.typing import Frame, IntoDataFrame
2627

2728

2829
def get_module_version_as_tuple(module_name: str) -> tuple[int, ...]:
@@ -42,8 +43,8 @@ def get_module_version_as_tuple(module_name: str) -> tuple[int, ...]:
4243
PYSPARK_VERSION: tuple[int, ...] = get_module_version_as_tuple("pyspark")
4344
CUDF_VERSION: tuple[int, ...] = get_module_version_as_tuple("cudf")
4445

45-
Constructor: TypeAlias = Callable[[Any], "NativeLazyFrame | NativeDataFrame"]
46-
ConstructorEager: TypeAlias = Callable[[Any], "NativeDataFrame"]
46+
Constructor: TypeAlias = Callable[[Any], "NativeLazyFrame | IntoDataFrame"]
47+
ConstructorEager: TypeAlias = Callable[[Any], "IntoDataFrame"]
4748
ConstructorLazy: TypeAlias = Callable[[Any], "NativeLazyFrame"]
4849
ConstructorPandasLike: TypeAlias = Callable[[Any], "pd.DataFrame"]
4950

0 commit comments

Comments
 (0)