From b9929f2aa6a4042c44b81085de9448da8902ba5f Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 3 May 2023 11:39:27 -0700 Subject: [PATCH 1/2] BUG: incorrect is_array_like checks --- pandas/core/arrays/arrow/array.py | 35 +++++++++++++++---------------- pandas/core/common.py | 28 ++++--------------------- 2 files changed, 21 insertions(+), 42 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index b933a493603c6..4d62f680811ae 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -18,22 +18,6 @@ import numpy as np from pandas._libs import lib -from pandas._typing import ( - ArrayLike, - AxisInt, - Dtype, - FillnaOptions, - Iterator, - NpDtype, - PositionalIndexer, - Scalar, - Self, - SortKind, - TakeIndexer, - TimeAmbiguous, - TimeNonexistent, - npt, -) from pandas.compat import ( pa_version_under7p0, pa_version_under8p0, @@ -140,8 +124,22 @@ def floordiv_compat( if TYPE_CHECKING: from pandas._typing import ( + ArrayLike, + AxisInt, + Dtype, + FillnaOptions, + Iterator, + NpDtype, NumpySorter, NumpyValueArrayLike, + PositionalIndexer, + Scalar, + Self, + SortKind, + TakeIndexer, + TimeAmbiguous, + TimeNonexistent, + npt, ) from pandas import Series @@ -805,8 +803,9 @@ def fillna( fallback_performancewarning() return super().fillna(value=value, method=method, limit=limit) - if is_array_like(value): - value = cast(ArrayLike, value) + if isinstance(value, (np.ndarray, ExtensionArray)): + # Similar to check_value_size, but we do not mask here since we may + # end up passing it to the super() method. if len(value) != len(self): raise ValueError( f"Length of 'value' does not match. Got ({len(value)}) " diff --git a/pandas/core/common.py b/pandas/core/common.py index 0f0d40ccdc4f3..ee8fe220698b5 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -33,11 +33,9 @@ from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike from pandas.core.dtypes.common import ( - is_array_like, is_bool_dtype, is_integer, ) -from pandas.core.dtypes.dtypes import ExtensionDtype from pandas.core.dtypes.generic import ( ABCExtensionArray, ABCIndex, @@ -120,9 +118,7 @@ def is_bool_indexer(key: Any) -> bool: check_array_indexer : Check that `key` is a valid array to index, and convert to an ndarray. """ - if isinstance(key, (ABCSeries, np.ndarray, ABCIndex)) or ( - is_array_like(key) and isinstance(key.dtype, ExtensionDtype) - ): + if isinstance(key, (ABCSeries, np.ndarray, ABCIndex, ABCExtensionArray)): if key.dtype == np.object_: key_array = np.asarray(key) @@ -420,7 +416,7 @@ def random_state(state: np.random.Generator) -> np.random.Generator: @overload def random_state( - state: int | ArrayLike | np.random.BitGenerator | np.random.RandomState | None, + state: int | np.ndarray | np.random.BitGenerator | np.random.RandomState | None, ) -> np.random.RandomState: ... @@ -445,24 +441,8 @@ def random_state(state: RandomState | None = None): np.random.RandomState or np.random.Generator. If state is None, returns np.random """ - if ( - is_integer(state) - or is_array_like(state) - or isinstance(state, np.random.BitGenerator) - ): - # error: Argument 1 to "RandomState" has incompatible type "Optional[Union[int, - # Union[ExtensionArray, ndarray[Any, Any]], Generator, RandomState]]"; expected - # "Union[None, Union[Union[_SupportsArray[dtype[Union[bool_, integer[Any]]]], - # Sequence[_SupportsArray[dtype[Union[bool_, integer[Any]]]]], - # Sequence[Sequence[_SupportsArray[dtype[Union[bool_, integer[Any]]]]]], - # Sequence[Sequence[Sequence[_SupportsArray[dtype[Union[bool_, - # integer[Any]]]]]]], - # Sequence[Sequence[Sequence[Sequence[_SupportsArray[dtype[Union[bool_, - # integer[Any]]]]]]]]], Union[bool, int, Sequence[Union[bool, int]], - # Sequence[Sequence[Union[bool, int]]], Sequence[Sequence[Sequence[Union[bool, - # int]]]], Sequence[Sequence[Sequence[Sequence[Union[bool, int]]]]]]], - # BitGenerator]" - return np.random.RandomState(state) # type: ignore[arg-type] + if is_integer(state) or isinstance(state, (np.ndarray, np.random.BitGenerator)): + return np.random.RandomState(state) elif isinstance(state, np.random.RandomState): return state elif isinstance(state, np.random.Generator): From 78171ed04ae6c2f199be6b12c2705d64f7394c30 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 3 May 2023 12:20:28 -0700 Subject: [PATCH 2/2] mypy fixup --- pandas/_typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/_typing.py b/pandas/_typing.py index dc3f2f54a54ca..9d4acbe76ba15 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -155,7 +155,7 @@ RandomState = Union[ int, - ArrayLike, + np.ndarray, np.random.Generator, np.random.BitGenerator, np.random.RandomState,