Skip to content

Commit 41ea47a

Browse files
committed
fix(typing): Get an agreement on variance
- Dropped `native` as it got too complex - I've done this fake `Any` thing to make `mypy` understand in multiple places
1 parent 5aaceb7 commit 41ea47a

File tree

2 files changed

+22
-32
lines changed

2 files changed

+22
-32
lines changed

narwhals/_compliant/group_by.py

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,11 @@
99
from typing import Mapping
1010
from typing import Sequence
1111

12-
from narwhals._compliant.typing import CompliantDataFrameT
13-
from narwhals._compliant.typing import CompliantExprT
14-
from narwhals._compliant.typing import CompliantFrameT
15-
from narwhals._compliant.typing import NativeFrameT_co
12+
from narwhals._compliant.typing import CompliantDataFrameT_co
13+
from narwhals._compliant.typing import CompliantExprT_contra
14+
from narwhals._compliant.typing import CompliantFrameT_co
1615
from narwhals._expression_parsing import is_elementary_expression
1716

18-
if TYPE_CHECKING:
19-
from typing_extensions import TypeAlias
20-
21-
from narwhals._compliant.dataframe import CompliantDataFrame
22-
from narwhals._compliant.dataframe import CompliantLazyFrame
23-
24-
Frame: TypeAlias = "CompliantDataFrame[Any, Any, NativeFrameT_co] | CompliantLazyFrame[Any, NativeFrameT_co]"
25-
2617
if not TYPE_CHECKING: # pragma: no cover
2718
if sys.version_info >= (3, 9):
2819
from typing import Protocol as Protocol38
@@ -36,34 +27,25 @@
3627
__all__ = ["CompliantGroupBy", "EagerGroupBy"]
3728

3829

39-
# NOTE: Type checkers disagree
40-
# - `pyright` wants invariant `*Expr`
41-
# - `mypy` want contravariant `*Expr`
42-
class CompliantGroupBy(Protocol38[CompliantFrameT, CompliantExprT]): # type: ignore[misc]
30+
class CompliantGroupBy(Protocol38[CompliantFrameT_co, CompliantExprT_contra]):
4331
_NARWHALS_TO_NATIVE_AGGREGATIONS: ClassVar[Mapping[str, Any]]
44-
_compliant_frame: CompliantFrameT
32+
_compliant_frame: Any
4533
_keys: Sequence[str]
4634

4735
def __init__(
4836
self,
49-
compliant_frame: CompliantFrameT,
37+
compliant_frame: CompliantFrameT_co,
5038
keys: Sequence[str],
5139
*,
5240
drop_null_keys: bool,
5341
) -> None: ...
5442
@property
55-
def compliant(self) -> CompliantFrameT:
56-
return self._compliant_frame
57-
58-
@property
59-
def native(
60-
self: CompliantGroupBy[Frame[NativeFrameT_co], CompliantExprT],
61-
) -> NativeFrameT_co:
62-
return self.compliant.native
43+
def compliant(self) -> CompliantFrameT_co:
44+
return self._compliant_frame # type: ignore[no-any-return]
6345

64-
def agg(self, *exprs: CompliantExprT) -> CompliantFrameT: ...
46+
def agg(self, *exprs: CompliantExprT_contra) -> CompliantFrameT_co: ...
6547

66-
def _ensure_all_simple(self, exprs: Sequence[CompliantExprT]) -> None:
48+
def _ensure_all_simple(self, exprs: Sequence[CompliantExprT_contra]) -> None:
6749
for expr in exprs:
6850
if (
6951
not is_elementary_expression(expr)
@@ -85,8 +67,8 @@ def _ensure_all_simple(self, exprs: Sequence[CompliantExprT]) -> None:
8567
raise ValueError(msg)
8668

8769

88-
class EagerGroupBy( # type: ignore[misc]
89-
CompliantGroupBy[CompliantDataFrameT, CompliantExprT],
90-
Protocol38[CompliantDataFrameT, CompliantExprT],
70+
class EagerGroupBy(
71+
CompliantGroupBy[CompliantDataFrameT_co, CompliantExprT_contra],
72+
Protocol38[CompliantDataFrameT_co, CompliantExprT_contra],
9173
):
92-
def __iter__(self) -> Iterator[tuple[Any, CompliantDataFrameT]]: ...
74+
def __iter__(self) -> Iterator[tuple[Any, CompliantDataFrameT_co]]: ...

narwhals/_compliant/typing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,17 @@
4242
"CompliantFrameT",
4343
bound="CompliantDataFrame[Any, Any, Any] | CompliantLazyFrame[Any, Any]",
4444
)
45+
CompliantFrameT_co = TypeVar(
46+
"CompliantFrameT_co",
47+
bound="CompliantDataFrame[Any, Any, Any] | CompliantLazyFrame[Any, Any]",
48+
covariant=True,
49+
)
4550
CompliantDataFrameT = TypeVar(
4651
"CompliantDataFrameT", bound="CompliantDataFrame[Any, Any, Any]"
4752
)
53+
CompliantDataFrameT_co = TypeVar(
54+
"CompliantDataFrameT_co", bound="CompliantDataFrame[Any, Any, Any]", covariant=True
55+
)
4856
CompliantLazyFrameT = TypeVar("CompliantLazyFrameT", bound="CompliantLazyFrame[Any, Any]")
4957
IntoCompliantExpr: TypeAlias = "CompliantExpr[CompliantFrameT, CompliantSeriesOrNativeExprT_co] | CompliantSeriesOrNativeExprT_co"
5058
CompliantExprT = TypeVar("CompliantExprT", bound="CompliantExpr[Any, Any]")

0 commit comments

Comments
 (0)