Skip to content

Commit bfe8513

Browse files
committed
wip typing
1 parent 11a02ef commit bfe8513

File tree

7 files changed

+53
-51
lines changed

7 files changed

+53
-51
lines changed

narwhals/pandas_like/dataframe.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from narwhals.pandas_like.group_by_object import GroupBy
2323
from narwhals.pandas_like.group_by_object import LazyGroupBy
2424
from narwhals.pandas_like.namespace import Namespace
25-
from narwhals.pandas_like.utils import IntoExpr
25+
from narwhals.spec import IntoExpr
2626

2727

2828
class DataFrame(DataFrameT):
@@ -42,10 +42,10 @@ def __init__(
4242

4343
@property
4444
def columns(self) -> list[str]:
45-
return self.dataframe.columns.tolist()
45+
return self.dataframe.columns.tolist() # type: ignore[no-any-return]
4646

4747
def _dispatch_to_lazy(self, method: str, *args: Any, **kwargs: Any) -> Self:
48-
return getattr(self.lazy(), method)(*args, **kwargs).collect()
48+
return getattr(self.lazy(), method)(*args, **kwargs).collect() # type: ignore[no-any-return]
4949

5050
def __repr__(self) -> str: # pragma: no cover
5151
header = f" Standard DataFrame (api_version={self._api_version}) "
@@ -90,7 +90,7 @@ def __dataframe_namespace__(
9090

9191
return Namespace(
9292
api_version=self._api_version,
93-
implementation=self._implementation, # type: ignore[attr-defined]
93+
implementation=self._implementation,
9494
)
9595

9696
@property
@@ -189,7 +189,7 @@ def __init__(
189189

190190
@property
191191
def columns(self) -> list[str]:
192-
return self.dataframe.columns.tolist()
192+
return self.dataframe.columns.tolist() # type: ignore[no-any-return]
193193

194194
def __repr__(self) -> str: # pragma: no cover
195195
header = f" Standard DataFrame (api_version={self._api_version}) "
@@ -241,7 +241,7 @@ def __lazyframe_namespace__(
241241

242242
return Namespace(
243243
api_version=self._api_version,
244-
implementation=self._implementation, # type: ignore[attr-defined]
244+
implementation=self._implementation,
245245
)
246246

247247
def group_by(self, *keys: str | Iterable[str]) -> LazyGroupBy:
@@ -256,7 +256,7 @@ def select(
256256
) -> Self:
257257
new_series = evaluate_into_exprs(self, *exprs, **named_exprs)
258258
df = horizontal_concat(
259-
[series.series for series in new_series], # type: ignore[attr-defined]
259+
[series.series for series in new_series],
260260
implementation=self._implementation,
261261
)
262262
return self._from_dataframe(df)
@@ -279,10 +279,7 @@ def with_columns(
279279
) -> Self:
280280
new_series = evaluate_into_exprs(self, *exprs, **named_exprs)
281281
df = self.dataframe.assign(
282-
**{
283-
series.name: series.series # type: ignore[attr-defined]
284-
for series in new_series
285-
}
282+
**{series.name: series.series for series in new_series}
286283
)
287284
return self._from_dataframe(df)
288285

@@ -330,7 +327,7 @@ def join(
330327

331328
return self._from_dataframe(
332329
self.dataframe.merge(
333-
other.dataframe, # type: ignore[attr-defined]
330+
other.dataframe,
334331
left_on=left_on,
335332
right_on=right_on,
336333
how=how,

narwhals/pandas_like/expr.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ def from_column_names(
5353
return cls(
5454
lambda df: [
5555
Series(
56-
df.dataframe.loc[:, column_name], # type: ignore[union-attr]
57-
api_version=df._api_version, # type: ignore[union-attr] # type: ignore[union-attr]
56+
df.dataframe.loc[:, column_name],
57+
api_version=df._api_version,
5858
implementation=implementation,
5959
)
6060
for column_name in column_names
@@ -71,7 +71,7 @@ def __expr_namespace__(self) -> NamespaceProtocol:
7171

7272
return Namespace(
7373
api_version="todo",
74-
implementation=self._implementation, # type: ignore[attr-defined]
74+
implementation=self._implementation,
7575
)
7676

7777
def __eq__(self, other: Expr | Any) -> Self: # type: ignore[override]
@@ -104,7 +104,7 @@ def __or__(self, other: Expr | bool | Any) -> Self:
104104
def __ror__(self, other: Any) -> Self:
105105
return register_expression_call(self, "__ror__", other)
106106

107-
def __add__(self, other: Expr | Any) -> Self: # type: ignore[override]
107+
def __add__(self, other: Expr | Any) -> Self:
108108
return register_expression_call(self, "__add__", other)
109109

110110
def __radd__(self, other: Any) -> Self:
@@ -222,31 +222,31 @@ def ends_with(self, suffix: str) -> Expr:
222222
lambda df: [
223223
Series(
224224
series.series.str.endswith(suffix),
225-
api_version=df._api_version, # type: ignore[union-attr]
226-
implementation=df._implementation, # type: ignore[union-attr]
225+
api_version=df._api_version,
226+
implementation=df._implementation,
227227
)
228-
for series in self._expr.call(df) # type: ignore[attr-defined]
228+
for series in self._expr.call(df)
229229
],
230-
depth=self._expr._depth + 1, # type: ignore[attr-defined]
231-
function_name=self._expr._function_name, # type: ignore[attr-defined]
232-
root_names=self._expr._root_names, # type: ignore[attr-defined]
233-
output_names=self._expr._output_names, # type: ignore[attr-defined]
234-
implementation=self._expr._implementation, # type: ignore[attr-defined]
230+
depth=self._expr._depth + 1,
231+
function_name=self._expr._function_name,
232+
root_names=self._expr._root_names,
233+
output_names=self._expr._output_names,
234+
implementation=self._expr._implementation,
235235
)
236236

237237
def strip_chars(self, characters: str = " ") -> Expr:
238238
return Expr(
239239
lambda df: [
240240
Series(
241-
series.series.str.strip(characters), # type: ignore[attr-defined]
242-
api_version=df._api_version, # type: ignore[union-attr]
243-
implementation=df._implementation, # type: ignore[union-attr]
241+
series.series.str.strip(characters),
242+
api_version=df._api_version,
243+
implementation=df._implementation,
244244
)
245-
for series in self._expr.call(df) # type: ignore[attr-defined]
245+
for series in self._expr.call(df)
246246
],
247-
depth=self._expr._depth + 1, # type: ignore[attr-defined]
248-
function_name=self._expr._function_name, # type: ignore[attr-defined]
249-
root_names=self._expr._root_names, # type: ignore[attr-defined]
250-
output_names=self._expr._output_names, # type: ignore[attr-defined]
251-
implementation=self._expr._implementation, # type: ignore[attr-defined]
247+
depth=self._expr._depth + 1,
248+
function_name=self._expr._function_name,
249+
root_names=self._expr._root_names,
250+
output_names=self._expr._output_names,
251+
implementation=self._expr._implementation,
252252
)

narwhals/pandas_like/group_by_object.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def agg(
6161
implementation: str = self._df._implementation # type: ignore[attr-defined]
6262
output_names: list[str] = self._keys
6363
for expr in exprs:
64-
expr_output_names = expr._output_names # type: ignore[attr-defined]
64+
expr_output_names = expr._output_names
6565
if expr_output_names is None:
6666
msg = (
6767
"Anonymous expressions are not supported in group_by.agg.\n"
@@ -87,7 +87,7 @@ def agg(
8787
# TODO: it might be better to use groupby(...).apply
8888
# in this case, but I couldn't get the multi-output
8989
# case to work for cuDF.
90-
results_keys = expr.call( # type: ignore[attr-defined]
90+
results_keys = expr.call(
9191
LazyFrame(
9292
df_keys,
9393
api_version=self.api_version,

narwhals/pandas_like/namespace.py

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from __future__ import annotations
22

33
from functools import reduce
4+
from typing import TYPE_CHECKING
45
from typing import Any
56
from typing import Callable
67
from typing import Iterable
8+
from typing import TypeVar
79

810
from narwhals.pandas_like.dataframe import DataFrame
911
from narwhals.pandas_like.dataframe import LazyFrame
@@ -13,10 +15,12 @@
1315
from narwhals.pandas_like.utils import horizontal_concat
1416
from narwhals.pandas_like.utils import parse_into_exprs
1517
from narwhals.pandas_like.utils import series_from_iterable
16-
from narwhals.spec import AnyDataFrame
1718
from narwhals.spec import IntoExpr
1819
from narwhals.spec import Namespace as NamespaceProtocol
1920

21+
if TYPE_CHECKING:
22+
AnyDataFrame = TypeVar("AnyDataFrame", DataFrame, LazyFrame)
23+
2024

2125
class Namespace(NamespaceProtocol):
2226
def __init__(self, *, api_version: str, implementation: str) -> None:
@@ -38,7 +42,7 @@ def concat(self, items: Iterable[AnyDataFrame], *, how: str) -> AnyDataFrame:
3842
dfs: list[Any] = []
3943
kind: Any = {}
4044
for df in items:
41-
dfs.append(df.dataframe) # type: ignore[union-attr, attr-defined]
45+
dfs.append(df.dataframe)
4246
kind.append(type(df))
4347
if len(kind) > 1:
4448
msg = "Can only concat DataFrames or LazyFrames, not mixtures of the two"
@@ -88,12 +92,12 @@ def len(self) -> Expr:
8892
lambda df: [
8993
Series(
9094
series_from_iterable(
91-
[len(df.dataframe)], # type: ignore[union-attr]
95+
[len(df.dataframe)],
9296
name="len",
9397
index=[0],
9498
implementation=self._implementation,
9599
),
96-
api_version=df._api_version, # type: ignore[union-attr]
100+
api_version=df._api_version,
97101
implementation=self._implementation,
98102
),
99103
],
@@ -126,8 +130,8 @@ def _create_series_from_scalar(self, value: Any, series: Series) -> Series:
126130
return Series(
127131
series_from_iterable(
128132
[value],
129-
name=series.series.name, # type: ignore[attr-defined]
130-
index=series.series.index[0:1], # type: ignore[attr-defined]
133+
name=series.series.name,
134+
index=series.series.index[0:1],
131135
implementation=self._implementation,
132136
),
133137
api_version=self.api_version,
@@ -148,8 +152,8 @@ def all(self) -> Expr:
148152
return Expr(
149153
lambda df: [
150154
Series(
151-
df.dataframe.loc[:, column_name], # type: ignore[union-attr]
152-
api_version=df._api_version, # type: ignore[union-attr]
155+
df.dataframe.loc[:, column_name],
156+
api_version=df._api_version,
153157
implementation=self._implementation,
154158
)
155159
for column_name in df.columns

narwhals/pandas_like/series.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ def drop_nulls(self) -> Series:
266266

267267
def n_unique(self) -> int:
268268
ser = self.series
269-
return ser.nunique()
269+
return ser.nunique() # type: ignore[no-any-return]
270270

271271
def zip_with(self, mask: SeriesProtocol, other: SeriesProtocol) -> SeriesProtocol:
272272
ser = self.series
@@ -280,7 +280,7 @@ def sample(self, n: int, fraction: float, *, with_replacement: bool) -> Series:
280280

281281
def unique(self) -> SeriesProtocol:
282282
ser = self.series
283-
return ser.unique()
283+
return ser.unique() # type: ignore[no-any-return]
284284

285285
def is_nan(self) -> Series:
286286
ser = self.series

narwhals/translate.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111

1212
def to_polars_api(df: Any, version: str) -> tuple[LazyFrame, Namespace]:
13-
if hasattr(df, "__narwhals__"):
14-
return df.__narwhals__()
13+
if hasattr(df, "__narwhals_dataframe__"):
14+
return df.__narwhals_dataframe__() # type: ignore[no-any-return]
1515
try:
1616
import polars as pl
1717
except ModuleNotFoundError:
@@ -76,12 +76,12 @@ def get_namespace(obj: Any, implementation: str | None = None) -> Namespace:
7676
if isinstance(obj, (pl.DataFrame, pl.LazyFrame, pl.Series)):
7777
return pl # type: ignore[return-value]
7878
if hasattr(obj, "__dataframe_namespace__"):
79-
return obj.__dataframe_namespace__()
79+
return obj.__dataframe_namespace__() # type: ignore[no-any-return]
8080
if hasattr(obj, "__series_namespace__"):
81-
return obj.__series_namespace__()
81+
return obj.__series_namespace__() # type: ignore[no-any-return]
8282
if hasattr(obj, "__lazyframe_namespace__"):
83-
return obj.__lazyframe_namespace__()
83+
return obj.__lazyframe_namespace__() # type: ignore[no-any-return]
8484
if hasattr(obj, "__expr_namespace__"):
85-
return obj.__expr_namespace__()
85+
return obj.__expr_namespace__() # type: ignore[no-any-return]
8686
msg = f"Could not find namespace for object {obj}"
8787
raise TypeError(msg)

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ exclude_also = [
8383
]
8484

8585
[tool.mypy]
86+
strict = true
8687

8788
[[tool.mypy.overrides]]
8889
# the pandas API is just too inconsistent for type hinting to be useful.

0 commit comments

Comments
 (0)