From 25d29e69e2003935184b3a48bba0467da42daae3 Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Thu, 4 Apr 2024 10:18:00 -0700 Subject: [PATCH 1/6] fix: add List, Dict, Tuple and NamedTuple to the GenericDType bound Signed-off-by: Sam Goodwin --- pandera/typing/common.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pandera/typing/common.py b/pandera/typing/common.py index f347103e1..af7debf84 100644 --- a/pandera/typing/common.py +++ b/pandera/typing/common.py @@ -2,7 +2,7 @@ # pylint:disable=abstract-method,too-many-ancestors,invalid-name import inspect -from typing import TYPE_CHECKING, Any, Generic, Optional, Type, TypeVar, Union +from typing import TYPE_CHECKING, Any, Generic, Optional, Type, TypeVar, Union, List, Dict, Tuple, NamedTuple, TypedDict import pandas as pd import typing_inspect @@ -59,6 +59,10 @@ int, str, float, + List[Any], + Dict[Any, Any], + Tuple[Any], + NamedTuple, pd.core.dtypes.base.ExtensionDtype, Bool, Date, @@ -101,6 +105,10 @@ int, str, float, + List[Any], + Dict[Any, Any], + Tuple[Any], + NamedTuple, pd.core.dtypes.base.ExtensionDtype, Bool, Date, From fd0f5df9dc13fa21e0d07bd0ae84eecb360e4339 Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Thu, 4 Apr 2024 10:24:42 -0700 Subject: [PATCH 2/6] chore: fix linter rules Signed-off-by: Sam Goodwin --- pandera/typing/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandera/typing/common.py b/pandera/typing/common.py index af7debf84..a84f073f7 100644 --- a/pandera/typing/common.py +++ b/pandera/typing/common.py @@ -2,7 +2,7 @@ # pylint:disable=abstract-method,too-many-ancestors,invalid-name import inspect -from typing import TYPE_CHECKING, Any, Generic, Optional, Type, TypeVar, Union, List, Dict, Tuple, NamedTuple, TypedDict +from typing import TYPE_CHECKING, Any, Generic, Optional, Type, TypeVar, Union, List, Dict, Tuple, NamedTuple import pandas as pd import typing_inspect From 8ab65a58dba3f220ec93f1c20b2ced3b5c8792b8 Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Thu, 4 Apr 2024 10:32:23 -0700 Subject: [PATCH 3/6] chore: apply formatting Signed-off-by: Sam Goodwin --- pandera/typing/common.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pandera/typing/common.py b/pandera/typing/common.py index a84f073f7..81f6c63a4 100644 --- a/pandera/typing/common.py +++ b/pandera/typing/common.py @@ -1,8 +1,21 @@ """Common typing functionality.""" + # pylint:disable=abstract-method,too-many-ancestors,invalid-name import inspect -from typing import TYPE_CHECKING, Any, Generic, Optional, Type, TypeVar, Union, List, Dict, Tuple, NamedTuple +from typing import ( + TYPE_CHECKING, + Any, + Generic, + Optional, + Type, + TypeVar, + Union, + List, + Dict, + Tuple, + NamedTuple, +) import pandas as pd import typing_inspect From 0618909d659d39520c2fd01ccdb5b8169eadb6e6 Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Mon, 8 Apr 2024 22:54:37 -0700 Subject: [PATCH 4/6] add tests for complex python types Signed-off-by: Sam Goodwin --- tests/core/test_typing.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/tests/core/test_typing.py b/tests/core/test_typing.py index 3da36f216..a8c159ad8 100644 --- a/tests/core/test_typing.py +++ b/tests/core/test_typing.py @@ -1,7 +1,7 @@ """Test typing annotations for the model api.""" # pylint:disable=missing-class-docstring,too-few-public-methods import re -from typing import Any, Dict, Optional, Type +from typing import Any, Dict, NamedTuple, Optional, Type import numpy as np import pandas as pd @@ -487,3 +487,26 @@ def test_init_pandas_dataframe_errors(invalid_data): """Test errors from initializing a pandas.typing.DataFrame with Schema.""" with pytest.raises(pa.errors.SchemaError): DataFrame[InitSchema](invalid_data) + +class ExampleNamedTuple(NamedTuple): + a: int + b: float + +class SchemaComplexPythonCollectionTypes(pa.DataFrameModel): + list: list[pa.typing.Int32] + dict: dict[str, pa.typing.Int32] + tuple2: tuple[pa.typing.Int32, pa.typing.Int32] + named_tuple: ExampleNamedTuple + +def test_complex_python_collection_types(): + """Test complex python collection types.""" + assert isinstance( + DataFrame[SchemaComplexPythonCollectionTypes]({ + "list": [[1, 2], [3, 4, 5]], + "dict": [{ "a": 1, "b": 2 }, { "c": 1, "d": 2 }] , + "tuple2": [[6, 7], [8, 9]], + "named_tuple": [ExampleNamedTuple(1, 2), ExampleNamedTuple(3, 4)] + }), + DataFrame, + ) + \ No newline at end of file From a48b798cc0641e75d7337722f6c995936813fedf Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Mon, 15 Apr 2024 13:34:15 -0700 Subject: [PATCH 5/6] fix: formatting Signed-off-by: Sam Goodwin --- tests/core/test_typing.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/tests/core/test_typing.py b/tests/core/test_typing.py index a8c159ad8..9eed0c523 100644 --- a/tests/core/test_typing.py +++ b/tests/core/test_typing.py @@ -488,25 +488,32 @@ def test_init_pandas_dataframe_errors(invalid_data): with pytest.raises(pa.errors.SchemaError): DataFrame[InitSchema](invalid_data) + class ExampleNamedTuple(NamedTuple): a: int b: float + class SchemaComplexPythonCollectionTypes(pa.DataFrameModel): list: list[pa.typing.Int32] dict: dict[str, pa.typing.Int32] tuple2: tuple[pa.typing.Int32, pa.typing.Int32] named_tuple: ExampleNamedTuple + def test_complex_python_collection_types(): """Test complex python collection types.""" assert isinstance( - DataFrame[SchemaComplexPythonCollectionTypes]({ - "list": [[1, 2], [3, 4, 5]], - "dict": [{ "a": 1, "b": 2 }, { "c": 1, "d": 2 }] , - "tuple2": [[6, 7], [8, 9]], - "named_tuple": [ExampleNamedTuple(1, 2), ExampleNamedTuple(3, 4)] - }), + DataFrame[SchemaComplexPythonCollectionTypes]( + { + "list": [[1, 2], [3, 4, 5]], + "dict": [{"a": 1, "b": 2}, {"c": 1, "d": 2}], + "tuple2": [[6, 7], [8, 9]], + "named_tuple": [ + ExampleNamedTuple(1, 2), + ExampleNamedTuple(3, 4), + ], + } + ), DataFrame, ) - \ No newline at end of file From 370086cd01c5bfccb945c88201d17531335fe225 Mon Sep 17 00:00:00 2001 From: Sam Goodwin Date: Sat, 20 Apr 2024 14:25:22 -0700 Subject: [PATCH 6/6] fix: use List, Dict and Tuple for python 3.8 Signed-off-by: Sam Goodwin --- tests/core/test_typing.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/core/test_typing.py b/tests/core/test_typing.py index 9eed0c523..9779c5117 100644 --- a/tests/core/test_typing.py +++ b/tests/core/test_typing.py @@ -1,7 +1,7 @@ """Test typing annotations for the model api.""" # pylint:disable=missing-class-docstring,too-few-public-methods import re -from typing import Any, Dict, NamedTuple, Optional, Type +from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type import numpy as np import pandas as pd @@ -495,9 +495,9 @@ class ExampleNamedTuple(NamedTuple): class SchemaComplexPythonCollectionTypes(pa.DataFrameModel): - list: list[pa.typing.Int32] - dict: dict[str, pa.typing.Int32] - tuple2: tuple[pa.typing.Int32, pa.typing.Int32] + list: List[pa.typing.Int32] + dict: Dict[str, pa.typing.Int32] + tuple2: Tuple[pa.typing.Int32, pa.typing.Int32] named_tuple: ExampleNamedTuple