Skip to content

Commit d1d58a6

Browse files
committed
fix(typing): factor out imports, avoid redef
- `mypy` just needed the `else` block - but this is much more maintainable
1 parent 612d974 commit d1d58a6

File tree

3 files changed

+63
-63
lines changed

3 files changed

+63
-63
lines changed

narwhals/_spark_like/dataframe.py

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

33
import warnings
4-
from importlib import import_module
54
from typing import TYPE_CHECKING
65
from typing import Any
76
from typing import Iterator
87
from typing import Literal
98
from typing import Sequence
109

1110
from narwhals._spark_like.utils import evaluate_exprs
11+
from narwhals._spark_like.utils import import_functions
12+
from narwhals._spark_like.utils import import_native_dtypes
13+
from narwhals._spark_like.utils import import_window
1214
from narwhals._spark_like.utils import native_to_narwhals_dtype
1315
from narwhals.exceptions import InvalidOperationError
1416
from narwhals.typing import CompliantDataFrame
@@ -70,51 +72,30 @@ def _F(self: Self): # type: ignore[no-untyped-def] # noqa: ANN202, N802
7072

7173
return functions
7274
else:
73-
if self._implementation is Implementation.SQLFRAME:
74-
from sqlframe.base.session import _BaseSession
75-
76-
return import_module(
77-
f"sqlframe.{_BaseSession().execution_dialect_name}.functions"
78-
)
79-
80-
from pyspark.sql import functions
81-
82-
return functions
75+
return import_functions(self._implementation)
8376

8477
@property
8578
def _native_dtypes(self: Self): # type: ignore[no-untyped-def] # noqa: ANN202
8679
if TYPE_CHECKING:
8780
from sqlframe.base import types
8881

8982
return types
90-
91-
if self._implementation is Implementation.SQLFRAME:
92-
from sqlframe.base.session import _BaseSession
93-
94-
return import_module(
95-
f"sqlframe.{_BaseSession().execution_dialect_name}.types"
96-
)
97-
98-
from pyspark.sql import types # type: ignore[no-redef]
99-
100-
return types
83+
else:
84+
return import_native_dtypes(self._implementation)
10185

10286
@property
10387
def _Window(self: Self) -> type[Window]: # noqa: N802
104-
if self._implementation is Implementation.SQLFRAME:
105-
from sqlframe.base.session import _BaseSession
106-
107-
_window = import_module(
108-
f"sqlframe.{_BaseSession().execution_dialect_name}.window"
109-
)
110-
return _window.Window
111-
112-
from pyspark.sql import Window
88+
if TYPE_CHECKING:
89+
from sqlframe.base.window import Window
11390

114-
return Window
91+
return Window
92+
else:
93+
return import_window(self._implementation)
11594

11695
@property
11796
def _session(self: Self) -> SQLFrameSession:
97+
if TYPE_CHECKING:
98+
return self._native_frame.session
11899
if self._implementation is Implementation.SQLFRAME:
119100
return self._native_frame.session
120101

narwhals/_spark_like/expr.py

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
import operator
4-
from importlib import import_module
54
from typing import TYPE_CHECKING
65
from typing import Any
76
from typing import Callable
@@ -16,6 +15,9 @@
1615
from narwhals._spark_like.expr_name import SparkLikeExprNameNamespace
1716
from narwhals._spark_like.expr_str import SparkLikeExprStringNamespace
1817
from narwhals._spark_like.expr_struct import SparkLikeExprStructNamespace
18+
from narwhals._spark_like.utils import import_functions
19+
from narwhals._spark_like.utils import import_native_dtypes
20+
from narwhals._spark_like.utils import import_window
1921
from narwhals._spark_like.utils import maybe_evaluate_expr
2022
from narwhals._spark_like.utils import narwhals_to_native_dtype
2123
from narwhals.dependencies import get_pyspark
@@ -87,47 +89,26 @@ def _F(self: Self): # type: ignore[no-untyped-def] # noqa: ANN202, N802
8789
from sqlframe.base import functions
8890

8991
return functions
90-
if self._implementation is Implementation.SQLFRAME:
91-
from sqlframe.base.session import _BaseSession
92-
93-
return import_module(
94-
f"sqlframe.{_BaseSession().execution_dialect_name}.functions"
95-
)
96-
97-
from pyspark.sql import functions # type: ignore[no-redef]
98-
99-
return functions
92+
else:
93+
return import_functions(self._implementation)
10094

10195
@property
10296
def _native_dtypes(self: Self): # type: ignore[no-untyped-def] # noqa: ANN202
10397
if TYPE_CHECKING:
10498
from sqlframe.base import types
10599

106100
return types
107-
if self._implementation is Implementation.SQLFRAME:
108-
from sqlframe.base.session import _BaseSession
109-
110-
return import_module(
111-
f"sqlframe.{_BaseSession().execution_dialect_name}.types"
112-
)
113-
114-
from pyspark.sql import types # type: ignore[no-redef]
115-
116-
return types
101+
else:
102+
return import_native_dtypes(self._implementation)
117103

118104
@property
119105
def _Window(self: Self) -> type[Window]: # noqa: N802
120-
if self._implementation is Implementation.SQLFRAME:
121-
from sqlframe.base.session import _BaseSession
122-
123-
_window = import_module(
124-
f"sqlframe.{_BaseSession().execution_dialect_name}.window"
125-
)
126-
return _window.Window
127-
128-
from pyspark.sql import Window
106+
if TYPE_CHECKING:
107+
from sqlframe.base.window import Window
129108

130-
return Window
109+
return Window
110+
else:
111+
return import_window(self._implementation)
131112

132113
def __narwhals_expr__(self: Self) -> None: ...
133114

narwhals/_spark_like/utils.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from importlib import import_module
34
from typing import TYPE_CHECKING
45
from typing import Any
56
from typing import cast
@@ -246,3 +247,40 @@ def _var_pyspark(col: Any, ddof: int, /) -> Column:
246247
from pyspark.pandas.spark.functions import var
247248

248249
return cast("Column", var(col, ddof=ddof))
250+
251+
252+
def import_functions(implementation: Implementation, /) -> ModuleType:
253+
if implementation is Implementation.SQLFRAME:
254+
from sqlframe.base.session import _BaseSession
255+
256+
return import_module(
257+
f"sqlframe.{_BaseSession().execution_dialect_name}.functions"
258+
)
259+
260+
from pyspark.sql import functions
261+
262+
return functions
263+
264+
265+
def import_native_dtypes(implementation: Implementation, /) -> ModuleType:
266+
if implementation is Implementation.SQLFRAME:
267+
from sqlframe.base.session import _BaseSession
268+
269+
return import_module(f"sqlframe.{_BaseSession().execution_dialect_name}.types")
270+
271+
from pyspark.sql import types
272+
273+
return types
274+
275+
276+
def import_window(implementation: Implementation, /) -> type[Any]:
277+
if implementation is Implementation.SQLFRAME:
278+
from sqlframe.base.session import _BaseSession
279+
280+
return import_module(
281+
f"sqlframe.{_BaseSession().execution_dialect_name}.window"
282+
).Window
283+
284+
from pyspark.sql import Window
285+
286+
return Window

0 commit comments

Comments
 (0)