From 72bf101974564cd29076416fe2fff780d79e6b51 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 15:35:00 +0000 Subject: [PATCH 01/12] pandas\core\common.py:273: error: Implicit generic "Any". Use "typing.List" and specify generic parameters --- pandas/core/common.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pandas/core/common.py b/pandas/core/common.py index 9017584171850..8025ca36eeba2 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -9,7 +9,7 @@ from datetime import datetime, timedelta from functools import partial import inspect -from typing import Any, Iterable, Union +from typing import Any, Iterable, TypeVar, Union import numpy as np @@ -270,7 +270,10 @@ def maybe_make_list(obj): return obj -def maybe_iterable_to_list(obj: Union[Iterable, Any]) -> Union[list, Any]: +_T = TypeVar("_T") + + +def maybe_iterable_to_list(obj: Union[Iterable[_T], _T]) -> Union[Iterable[_T], _T]: """ If obj is Iterable but not list-like, consume into list. """ From 1f70371fb5e3f42a489b3cd86cda2c102e6b170d Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 15:49:32 +0000 Subject: [PATCH 02/12] pandas\core\arrays\categorical.py:514: error: Implicit generic "Any". Use "typing.List" and specify generic parameters --- pandas/_typing.py | 7 +++++-- pandas/core/arrays/categorical.py | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index 69b08c581cff9..6c604fac6bf05 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -23,6 +23,7 @@ from pandas.core.indexes.base import Index # noqa: F401 from pandas.core.series import Series # noqa: F401 from pandas.core.generic import NDFrame # noqa: F401 + from pandas import Interval # noqa: F401 AnyArrayLike = TypeVar("AnyArrayLike", "ExtensionArray", "Index", "Series", np.ndarray) @@ -32,10 +33,12 @@ FilePathOrBuffer = Union[str, Path, IO[AnyStr]] FrameOrSeries = TypeVar("FrameOrSeries", bound="NDFrame") -Scalar = Union[str, int, float, bool] +PythonScalar = Union[str, int, float, bool] +PandasScalar = Union[DatetimeLikeScalar, "Interval"] +Scalar = Union[PythonScalar, PandasScalar] Axis = Union[str, int] Ordered = Optional[bool] -JSONSerializable = Union[Scalar, List, Dict] +JSONSerializable = Union[PythonScalar, List, Dict] Axes = Collection diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 4d6be8221557d..87896b8a89da4 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -1,6 +1,6 @@ import operator from shutil import get_terminal_size -from typing import Type, Union, cast +from typing import List, Type, Union, cast from warnings import warn import numpy as np @@ -8,7 +8,7 @@ from pandas._config import get_option from pandas._libs import algos as libalgos, hashtable as htable -from pandas._typing import ArrayLike, Dtype, Ordered +from pandas._typing import ArrayLike, Dtype, Ordered, Scalar from pandas.compat.numpy import function as nv from pandas.util._decorators import ( Appender, @@ -511,7 +511,7 @@ def itemsize(self) -> int: """ return self.categories.itemsize - def tolist(self) -> list: + def tolist(self) -> List[Scalar]: """ Return a list of the values. From f70bbc501c7da47bb696d8a1228bddae91aac6ff Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:02:54 +0000 Subject: [PATCH 03/12] pandas\core\indexing.py:2227: error: Implicit generic "Any". Use "typing.Tuple" and specify generic parameters --- pandas/core/indexing.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index b86293e78a80d..ebecb02e20e1a 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1,4 +1,4 @@ -from typing import Tuple +from typing import Hashable, List, Tuple, Union import numpy as np @@ -2224,7 +2224,7 @@ def _convert_key(self, key, is_setter: bool = False): return key -def _tuplify(ndim: int, loc) -> tuple: +def _tuplify(ndim: int, loc: Hashable) -> Tuple[Union[Hashable, slice], ...]: """ Given an indexer for the first dimension, create an equivalent tuple for indexing over all dimensions. @@ -2238,9 +2238,10 @@ def _tuplify(ndim: int, loc) -> tuple: ------- tuple """ - tup = [slice(None, None) for _ in range(ndim)] - tup[0] = loc - return tuple(tup) + _tup: List[Union[Hashable, slice]] + _tup = [slice(None, None) for _ in range(ndim)] + _tup[0] = loc + return tuple(_tup) def convert_to_index_sliceable(obj, key): From e22ac1730c2034d5a615ecbdc4c1e5eedcddf0bd Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:19:27 +0000 Subject: [PATCH 04/12] pandas\core\groupby\grouper.py:422: error: Implicit generic "Any". Use "typing.Dict" and specify generic parameters --- pandas/core/arrays/categorical.py | 8 ++++---- pandas/core/groupby/grouper.py | 4 ++-- pandas/core/indexes/base.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 87896b8a89da4..53051baa8e67e 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -1,6 +1,6 @@ import operator from shutil import get_terminal_size -from typing import List, Type, Union, cast +from typing import Dict, Hashable, List, Type, Union, cast from warnings import warn import numpy as np @@ -2067,7 +2067,7 @@ def __setitem__(self, key, value): lindexer = self._maybe_coerce_indexer(lindexer) self._codes[key] = lindexer - def _reverse_indexer(self): + def _reverse_indexer(self) -> Dict[Hashable, np.ndarray]: """ Compute the inverse of a categorical, returning a dict of categories -> indexers. @@ -2097,8 +2097,8 @@ def _reverse_indexer(self): self.codes.astype("int64"), categories.size ) counts = counts.cumsum() - result = (r[start:end] for start, end in zip(counts, counts[1:])) - result = dict(zip(categories, result)) + _result = (r[start:end] for start, end in zip(counts, counts[1:])) + result = dict(zip(categories, _result)) return result # reduction ops # diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index 2c224a1bef338..747a32ae816be 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -3,7 +3,7 @@ split-apply-combine paradigm. """ -from typing import Hashable, List, Optional, Tuple +from typing import Dict, Hashable, List, Optional, Tuple import numpy as np @@ -419,7 +419,7 @@ def _make_codes(self) -> None: self._group_index = uniques @cache_readonly - def groups(self) -> dict: + def groups(self) -> Dict[Hashable, np.ndarray]: return self.index.groupby(Categorical.from_codes(self.codes, self.group_index)) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index a3808f6f4a37e..242c1971911b1 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -1,7 +1,7 @@ from datetime import datetime import operator from textwrap import dedent -from typing import FrozenSet, Hashable, Optional, Union +from typing import Dict, FrozenSet, Hashable, Optional, Union import warnings import numpy as np @@ -4594,7 +4594,7 @@ def _maybe_promote(self, other): return self.astype("object"), other.astype("object") return self, other - def groupby(self, values): + def groupby(self, values) -> Dict[Hashable, np.ndarray]: """ Group the index labels by a given array of values. @@ -4605,7 +4605,7 @@ def groupby(self, values): Returns ------- - groups : dict + dict {group name -> group labels} """ From 673e14e56ff6dd4878c39d9aade305d6c7c5ea7d Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:22:39 +0000 Subject: [PATCH 05/12] pandas\tests\frame\methods\test_replace.py:15: error: Implicit generic "Any". Use "typing.List" and specify generic parameters --- pandas/tests/frame/methods/test_replace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/methods/test_replace.py b/pandas/tests/frame/methods/test_replace.py index 3b01ae0c3c2e8..5191d584b86db 100644 --- a/pandas/tests/frame/methods/test_replace.py +++ b/pandas/tests/frame/methods/test_replace.py @@ -1,7 +1,7 @@ from datetime import datetime from io import StringIO import re -from typing import Dict +from typing import Dict, List, Union import numpy as np import pytest @@ -12,7 +12,7 @@ @pytest.fixture -def mix_ab() -> Dict[str, list]: +def mix_ab() -> Dict[str, List[Union[int, str]]]: return {"a": list(range(4)), "b": list("ab..")} From 2ba544d94cbf91936446e8332a6666906afb5065 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:24:17 +0000 Subject: [PATCH 06/12] pandas\tests\frame\methods\test_replace.py:20: error: Implicit generic "Any". Use "typing.List" and specify generic parameters --- pandas/tests/frame/methods/test_replace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/frame/methods/test_replace.py b/pandas/tests/frame/methods/test_replace.py index 5191d584b86db..00587a41b7933 100644 --- a/pandas/tests/frame/methods/test_replace.py +++ b/pandas/tests/frame/methods/test_replace.py @@ -17,7 +17,7 @@ def mix_ab() -> Dict[str, List[Union[int, str]]]: @pytest.fixture -def mix_abc() -> Dict[str, list]: +def mix_abc() -> Dict[str, List[Union[int, str, np.nan]]]: return {"a": list(range(4)), "b": list("ab.."), "c": ["a", "b", np.nan, "d"]} From f40eb8c59cda06f96c5109d6926d4ebd2cfa7d3c Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:26:55 +0000 Subject: [PATCH 07/12] pandas\io\pytables.py:1462: error: Implicit generic "Any". Use "typing.List" and specify generic parameters --- pandas/io/pytables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index db8d9eb669c20..4f1541e8d127e 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1459,7 +1459,7 @@ def copy( data = self.select(k) if isinstance(s, Table): - index: Union[bool, list] = False + index: Union[bool, List[str]] = False if propindexes: index = [a.name for a in s.axes if a.is_indexed] new_store.append( From 6c820ec1867c7669f3bfe7dd8d5fe7b6f1550618 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:50:58 +0000 Subject: [PATCH 08/12] np.nan is float --- pandas/tests/frame/methods/test_replace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/frame/methods/test_replace.py b/pandas/tests/frame/methods/test_replace.py index 00587a41b7933..b2720f9158c6b 100644 --- a/pandas/tests/frame/methods/test_replace.py +++ b/pandas/tests/frame/methods/test_replace.py @@ -17,7 +17,7 @@ def mix_ab() -> Dict[str, List[Union[int, str]]]: @pytest.fixture -def mix_abc() -> Dict[str, List[Union[int, str, np.nan]]]: +def mix_abc() -> Dict[str, List[Union[float, str]]]: return {"a": list(range(4)), "b": list("ab.."), "c": ["a", "b", np.nan, "d"]} From a08e76cc68fb120c61c3261931b45e9cfe31cb6c Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Sun, 29 Dec 2019 16:53:08 +0000 Subject: [PATCH 09/12] Iterable -> Collection --- pandas/core/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/common.py b/pandas/core/common.py index 8025ca36eeba2..2920f0ede2270 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -9,7 +9,7 @@ from datetime import datetime, timedelta from functools import partial import inspect -from typing import Any, Iterable, TypeVar, Union +from typing import Any, Collection, Iterable, TypeVar, Union import numpy as np @@ -273,7 +273,7 @@ def maybe_make_list(obj): _T = TypeVar("_T") -def maybe_iterable_to_list(obj: Union[Iterable[_T], _T]) -> Union[Iterable[_T], _T]: +def maybe_iterable_to_list(obj: Union[Iterable[_T], _T]) -> Union[Collection[_T], _T]: """ If obj is Iterable but not list-like, consume into list. """ From 7fc12ec593075ff5cbf987e0d7dd8e21b404de28 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 30 Dec 2019 14:08:45 +0000 Subject: [PATCH 10/12] update per comments --- pandas/_typing.py | 17 +++++++++++------ pandas/core/common.py | 8 +++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index 6c604fac6bf05..5ef26b124b0cc 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -25,22 +25,27 @@ from pandas.core.generic import NDFrame # noqa: F401 from pandas import Interval # noqa: F401 +# arrary-like AnyArrayLike = TypeVar("AnyArrayLike", "ExtensionArray", "Index", "Series", np.ndarray) ArrayLike = TypeVar("ArrayLike", "ExtensionArray", np.ndarray) -DatetimeLikeScalar = TypeVar("DatetimeLikeScalar", "Period", "Timestamp", "Timedelta") -Dtype = Union[str, np.dtype, "ExtensionDtype"] -FilePathOrBuffer = Union[str, Path, IO[AnyStr]] -FrameOrSeries = TypeVar("FrameOrSeries", bound="NDFrame") +# scalars + PythonScalar = Union[str, int, float, bool] +DatetimeLikeScalar = TypeVar("DatetimeLikeScalar", "Period", "Timestamp", "Timedelta") PandasScalar = Union[DatetimeLikeScalar, "Interval"] Scalar = Union[PythonScalar, PandasScalar] + +# other + +Dtype = Union[str, np.dtype, "ExtensionDtype"] +FilePathOrBuffer = Union[str, Path, IO[AnyStr]] +FrameOrSeries = TypeVar("FrameOrSeries", bound="NDFrame") Axis = Union[str, int] Ordered = Optional[bool] JSONSerializable = Union[PythonScalar, List, Dict] - Axes = Collection # to maintain type information across generic functions and parametrization -_T = TypeVar("_T") +T = TypeVar("T") diff --git a/pandas/core/common.py b/pandas/core/common.py index 2920f0ede2270..8a430a4aa7d11 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -9,11 +9,12 @@ from datetime import datetime, timedelta from functools import partial import inspect -from typing import Any, Collection, Iterable, TypeVar, Union +from typing import Any, Collection, Iterable, Union import numpy as np from pandas._libs import lib, tslibs +from pandas._typing import T from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike from pandas.core.dtypes.common import ( @@ -270,10 +271,7 @@ def maybe_make_list(obj): return obj -_T = TypeVar("_T") - - -def maybe_iterable_to_list(obj: Union[Iterable[_T], _T]) -> Union[Collection[_T], _T]: +def maybe_iterable_to_list(obj: Union[Iterable[T], T]) -> Union[Collection[T], T]: """ If obj is Iterable but not list-like, consume into list. """ From 41afe5772949914284c12aef7bb03b133af8fb80 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 30 Dec 2019 14:09:52 +0000 Subject: [PATCH 11/12] fix typo --- pandas/_typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index 5ef26b124b0cc..6099c6e30c3bb 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -25,7 +25,7 @@ from pandas.core.generic import NDFrame # noqa: F401 from pandas import Interval # noqa: F401 -# arrary-like +# array-like AnyArrayLike = TypeVar("AnyArrayLike", "ExtensionArray", "Index", "Series", np.ndarray) ArrayLike = TypeVar("ArrayLike", "ExtensionArray", np.ndarray) From 7d0d865c9647e3dc37124299fdebe7795d491fce Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 30 Dec 2019 18:48:51 +0000 Subject: [PATCH 12/12] replace typvar in union --- pandas/_typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index 6099c6e30c3bb..7b89486751f12 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -34,7 +34,7 @@ PythonScalar = Union[str, int, float, bool] DatetimeLikeScalar = TypeVar("DatetimeLikeScalar", "Period", "Timestamp", "Timedelta") -PandasScalar = Union[DatetimeLikeScalar, "Interval"] +PandasScalar = Union["Period", "Timestamp", "Timedelta", "Interval"] Scalar = Union[PythonScalar, PandasScalar] # other