From a970e3f7436c057dd277096363df1c82da9a7c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Sun, 20 Apr 2025 14:33:47 -0400 Subject: [PATCH 1/5] GH1173 Experiment with fuller typing --- pandas-stubs/core/frame.pyi | 14 ++++++++++++++ tests/test_frame.py | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index b42b79a7..3c6aa2ec 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -676,6 +676,13 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): self, expr: _str, *, + parser: Literal["pandas", "python"] = ..., + engine: Literal["python", "numexpr"] | None = ..., + local_dict: dict[_str, Any] | None = ..., + global_dict: dict[_str, Any] | None = ..., + resolvers: list[Mapping] | None = ..., + level: int = ..., + target: object | None = ..., inplace: Literal[True], **kwargs: Any, # TODO: make more precise https://github.com/pandas-dev/pandas-stubs/issues/1173 ) -> None: ... @@ -684,6 +691,13 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): self, expr: _str, *, + parser: Literal["pandas", "python"] = "pandas", + engine: Literal["python", "numexpr"] | None = "numexpr", + local_dict: dict[_str, Any] | None = None, + global_dict: dict[_str, Any] | None = None, + resolvers: list[Mapping] | None = None, + level: int = 0, + target: object | None = None, inplace: Literal[False] = ..., **kwargs: Any, # TODO: make more precise https://github.com/pandas-dev/pandas-stubs/issues/1173 ) -> Self: ... diff --git a/tests/test_frame.py b/tests/test_frame.py index 205f31a1..386e4fdc 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -513,6 +513,26 @@ def test_types_query() -> None: check(assert_type(df.query("col1 % col2 == 0", inplace=True), None), type(None)) +def test_types_query_kwargs() -> None: + df = pd.DataFrame(data={"col1": [1, 2, 3, 4], "col2": [3, 0, 1, 7]}) + check( + assert_type( + df.query("col1 > col2", parser="pandas", engine="numexpr"), pd.DataFrame + ), + pd.DataFrame, + ) + check( + assert_type( + df.query("col1 > col2", parser="pandas", engine="numexpr"), pd.DataFrame + ), + pd.DataFrame, + ) + kwargs = {"parser": "pandas", "engine": "numexpr"} + check(assert_type(df.query("col1 > col2", **kwargs), pd.DataFrame), pd.DataFrame) + + check(assert_type(df.query("col1 % col2 == 0", inplace=True), None), type(None)) + + def test_types_eval() -> None: df = pd.DataFrame(data={"col1": [1, 2, 3, 4], "col2": [3, 0, 1, 7]}) check(assert_type(df.eval("E = col1 > col2", inplace=True), None), type(None)) From 36bc58e6351bd9f458bcda173ea996778c71d354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Sun, 4 May 2025 21:49:32 -0400 Subject: [PATCH 2/5] GH1173 PR feedback --- pandas-stubs/core/frame.pyi | 14 +++++++------- tests/test_frame.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index 3c6aa2ec..7f5d678a 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -691,14 +691,14 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): self, expr: _str, *, - parser: Literal["pandas", "python"] = "pandas", - engine: Literal["python", "numexpr"] | None = "numexpr", - local_dict: dict[_str, Any] | None = None, - global_dict: dict[_str, Any] | None = None, - resolvers: list[Mapping] | None = None, - level: int = 0, - target: object | None = None, inplace: Literal[False] = ..., + parser: Literal["pandas", "python"] = ..., + engine: Literal["python", "numexpr"] | None = ..., + local_dict: dict[_str, Any] | None = ..., + global_dict: dict[_str, Any] | None = ..., + resolvers: list[Mapping] | None = ..., + level: int = ..., + target: object | None = ..., **kwargs: Any, # TODO: make more precise https://github.com/pandas-dev/pandas-stubs/issues/1173 ) -> Self: ... @overload diff --git a/tests/test_frame.py b/tests/test_frame.py index 386e4fdc..2182e484 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -528,7 +528,7 @@ def test_types_query_kwargs() -> None: pd.DataFrame, ) kwargs = {"parser": "pandas", "engine": "numexpr"} - check(assert_type(df.query("col1 > col2", **kwargs), pd.DataFrame), pd.DataFrame) + check(assert_type(df.query("col1 > col2", inplace=False, **kwargs), pd.DataFrame), pd.DataFrame) check(assert_type(df.query("col1 % col2 == 0", inplace=True), None), type(None)) From 34ea623b26a8575003d14a406afde43b660b50a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Sun, 4 May 2025 22:07:02 -0400 Subject: [PATCH 3/5] GH1173 PR feedback --- pandas-stubs/core/frame.pyi | 18 ++++++++++++++++-- tests/test_frame.py | 5 ++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index d5d9f33d..fe29a596 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -706,7 +706,14 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): level: int = ..., target: object | None = ..., inplace: Literal[True], - **kwargs: Any, # TODO: make more precise https://github.com/pandas-dev/pandas-stubs/issues/1173 + ) -> None: ... + @overload + def query( + self, + expr: _str, + *, + inplace: Literal[True], + **kwargs: Any, ) -> None: ... @overload def query( @@ -721,7 +728,14 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): resolvers: list[Mapping] | None = ..., level: int = ..., target: object | None = ..., - **kwargs: Any, # TODO: make more precise https://github.com/pandas-dev/pandas-stubs/issues/1173 + ) -> Self: ... + @overload + def query( + self, + expr: _str, + *, + inplace: Literal[False] = ..., + **kwargs: Any, ) -> Self: ... @overload def eval(self, expr: _str, *, inplace: Literal[True], **kwargs: Any) -> None: ... diff --git a/tests/test_frame.py b/tests/test_frame.py index 7a7e2c32..f4f2845a 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -529,7 +529,10 @@ def test_types_query_kwargs() -> None: pd.DataFrame, ) kwargs = {"parser": "pandas", "engine": "numexpr"} - check(assert_type(df.query("col1 > col2", inplace=False, **kwargs), pd.DataFrame), pd.DataFrame) + check( + assert_type(df.query("col1 > col2", inplace=False, **kwargs), pd.DataFrame), + pd.DataFrame, + ) check(assert_type(df.query("col1 % col2 == 0", inplace=True), None), type(None)) From d19ac8994dd69d4a1663310b45ce6cd288bd2cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Mon, 5 May 2025 20:24:27 -0400 Subject: [PATCH 4/5] GH1173 PR Feedback --- tests/test_frame.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_frame.py b/tests/test_frame.py index f4f2845a..807088d1 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -524,9 +524,10 @@ def test_types_query_kwargs() -> None: ) check( assert_type( - df.query("col1 > col2", parser="pandas", engine="numexpr"), pd.DataFrame + df.query("col1 > col2", parser="pandas", engine="numexpr", inplace=True), + None, ), - pd.DataFrame, + type(None), ) kwargs = {"parser": "pandas", "engine": "numexpr"} check( @@ -534,7 +535,10 @@ def test_types_query_kwargs() -> None: pd.DataFrame, ) - check(assert_type(df.query("col1 % col2 == 0", inplace=True), None), type(None)) + check( + assert_type(df.query("col1 % col2 == 0", inplace=True, **kwargs), None), + type(None), + ) def test_types_eval() -> None: From 9fb7bae313550107d022df2132dc61c20d3adda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Sat, 10 May 2025 12:18:11 -0400 Subject: [PATCH 5/5] GH1173 PR Feedback --- pandas-stubs/core/frame.pyi | 16 ---------------- tests/test_frame.py | 10 ---------- 2 files changed, 26 deletions(-) diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index fe29a596..ceeed150 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -708,14 +708,6 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): inplace: Literal[True], ) -> None: ... @overload - def query( - self, - expr: _str, - *, - inplace: Literal[True], - **kwargs: Any, - ) -> None: ... - @overload def query( self, expr: _str, @@ -730,14 +722,6 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack): target: object | None = ..., ) -> Self: ... @overload - def query( - self, - expr: _str, - *, - inplace: Literal[False] = ..., - **kwargs: Any, - ) -> Self: ... - @overload def eval(self, expr: _str, *, inplace: Literal[True], **kwargs: Any) -> None: ... @overload def eval( diff --git a/tests/test_frame.py b/tests/test_frame.py index 807088d1..699caef5 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -529,16 +529,6 @@ def test_types_query_kwargs() -> None: ), type(None), ) - kwargs = {"parser": "pandas", "engine": "numexpr"} - check( - assert_type(df.query("col1 > col2", inplace=False, **kwargs), pd.DataFrame), - pd.DataFrame, - ) - - check( - assert_type(df.query("col1 % col2 == 0", inplace=True, **kwargs), None), - type(None), - ) def test_types_eval() -> None: