diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c9cd7528bcd2f..f8e7dfe71115d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: rev: 23.3.0 hooks: - id: black -- repo: https://github.com/charliermarsh/ruff-pre-commit +- repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.0.270 hooks: - id: ruff @@ -94,7 +94,7 @@ repos: rev: v3.4.0 hooks: - id: pyupgrade - args: [--py38-plus] + args: [--py39-plus] - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: @@ -179,9 +179,6 @@ repos: |np\.bool[^_8`] |np\.object[^_8`] - # imports from collections.abc instead of `from collections import abc` - |from\ collections\.abc\ import - # Numpy |from\ numpy\ import\ random |from\ numpy\.random\ import diff --git a/doc/source/conf.py b/doc/source/conf.py index 31893bdf929d8..71bc05f6fd6e1 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -586,14 +586,7 @@ class AccessorCallableDocumenter(AccessorLevelDocumenter, MethodDocumenter): priority = 0.5 def format_name(self): - if sys.version_info < (3, 9): - # NOTE pyupgrade will remove this when we run it with --py39-plus - # so don't remove the unnecessary `else` statement below - from pandas.util._str_methods import removesuffix - - return removesuffix(MethodDocumenter.format_name(self), ".__call__") - else: - return MethodDocumenter.format_name(self).removesuffix(".__call__") + return MethodDocumenter.format_name(self).removesuffix(".__call__") class PandasAutosummary(Autosummary): diff --git a/pandas/_config/config.py b/pandas/_config/config.py index 9caeaadc1ad84..3ad35b3f9068b 100644 --- a/pandas/_config/config.py +++ b/pandas/_config/config.py @@ -56,11 +56,10 @@ ) import re from typing import ( + TYPE_CHECKING, Any, Callable, - Generator, Generic, - Iterable, NamedTuple, cast, ) @@ -72,6 +71,12 @@ ) from pandas.util._exceptions import find_stack_level +if TYPE_CHECKING: + from collections.abc import ( + Generator, + Iterable, + ) + class DeprecatedOption(NamedTuple): key: str diff --git a/pandas/_config/localization.py b/pandas/_config/localization.py index 4e9a0142af3a4..5c1a0ff139533 100644 --- a/pandas/_config/localization.py +++ b/pandas/_config/localization.py @@ -10,10 +10,13 @@ import platform import re import subprocess -from typing import Generator +from typing import TYPE_CHECKING from pandas._config.config import options +if TYPE_CHECKING: + from collections.abc import Generator + @contextmanager def set_locale( diff --git a/pandas/_testing/__init__.py b/pandas/_testing/__init__.py index ddb3acb7397e6..d1a729343e062 100644 --- a/pandas/_testing/__init__.py +++ b/pandas/_testing/__init__.py @@ -1,6 +1,7 @@ from __future__ import annotations import collections +from collections import Counter from datetime import datetime from decimal import Decimal import operator @@ -12,8 +13,6 @@ TYPE_CHECKING, Callable, ContextManager, - Counter, - Iterable, cast, ) @@ -109,6 +108,8 @@ from pandas.core.construction import extract_array if TYPE_CHECKING: + from collections.abc import Iterable + from pandas._typing import ( Dtype, Frequency, diff --git a/pandas/_testing/_warnings.py b/pandas/_testing/_warnings.py index 201aa81183301..11cf60ef36a9c 100644 --- a/pandas/_testing/_warnings.py +++ b/pandas/_testing/_warnings.py @@ -7,14 +7,18 @@ import re import sys from typing import ( - Generator, + TYPE_CHECKING, Literal, - Sequence, - Type, cast, ) import warnings +if TYPE_CHECKING: + from collections.abc import ( + Generator, + Sequence, + ) + @contextmanager def assert_produces_warning( @@ -91,7 +95,7 @@ class for all warnings. To raise multiple types of exceptions, yield w finally: if expected_warning: - expected_warning = cast(Type[Warning], expected_warning) + expected_warning = cast(type[Warning], expected_warning) _assert_caught_expected_warning( caught_warnings=w, expected_warning=expected_warning, @@ -195,7 +199,7 @@ def _is_unexpected_warning( """Check if the actual warning issued is unexpected.""" if actual_warning and not expected_warning: return True - expected_warning = cast(Type[Warning], expected_warning) + expected_warning = cast(type[Warning], expected_warning) return bool(not issubclass(actual_warning.category, expected_warning)) diff --git a/pandas/_testing/contexts.py b/pandas/_testing/contexts.py index f939bd42add93..ac1a6a2450444 100644 --- a/pandas/_testing/contexts.py +++ b/pandas/_testing/contexts.py @@ -8,7 +8,6 @@ IO, TYPE_CHECKING, Any, - Generator, ) import uuid @@ -20,6 +19,8 @@ from pandas.io.common import get_handle if TYPE_CHECKING: + from collections.abc import Generator + from pandas._typing import ( BaseBuffer, CompressionOptions, diff --git a/pandas/_typing.py b/pandas/_typing.py index ffe9e6b319dfd..ef53c117b7b45 100644 --- a/pandas/_typing.py +++ b/pandas/_typing.py @@ -1,5 +1,11 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterator, + Mapping, + Sequence, +) from datetime import ( datetime, timedelta, @@ -11,16 +17,9 @@ TYPE_CHECKING, Any, Callable, - Dict, - Hashable, - Iterator, - List, Literal, - Mapping, Optional, Protocol, - Sequence, - Tuple, Type as type_t, TypeVar, Union, @@ -111,7 +110,7 @@ # Cannot use `Sequence` because a string is a sequence, and we don't want to # accept that. Could refine if https://github.com/python/typing/issues/256 is # resolved to differentiate between Sequence[str] and str -ListLike = Union[AnyArrayLike, List, range] +ListLike = Union[AnyArrayLike, list, range] # scalars @@ -146,10 +145,10 @@ Axis = Union[AxisInt, Literal["index", "columns", "rows"]] IndexLabel = Union[Hashable, Sequence[Hashable]] Level = Hashable -Shape = Tuple[int, ...] -Suffixes = Tuple[Optional[str], Optional[str]] +Shape = tuple[int, ...] +Suffixes = tuple[Optional[str], Optional[str]] Ordered = Optional[bool] -JSONSerializable = Optional[Union[PythonScalar, List, Dict]] +JSONSerializable = Optional[Union[PythonScalar, list, dict]] Frequency = Union[str, "BaseOffset"] Axes = ListLike @@ -166,15 +165,15 @@ Dtype = Union["ExtensionDtype", NpDtype] AstypeArg = Union["ExtensionDtype", "npt.DTypeLike"] # DtypeArg specifies all allowable dtypes in a functions its dtype argument -DtypeArg = Union[Dtype, Dict[Hashable, Dtype]] +DtypeArg = Union[Dtype, dict[Hashable, Dtype]] DtypeObj = Union[np.dtype, "ExtensionDtype"] # converters -ConvertersArg = Dict[Hashable, Callable[[Dtype], Dtype]] +ConvertersArg = dict[Hashable, Callable[[Dtype], Dtype]] # parse_dates ParseDatesArg = Union[ - bool, List[Hashable], List[List[Hashable]], Dict[Hashable, List[Hashable]] + bool, list[Hashable], list[list[Hashable]], dict[Hashable, list[Hashable]] ] # For functions like rename that convert one label to another @@ -195,10 +194,10 @@ # types of `func` kwarg for DataFrame.aggregate and Series.aggregate AggFuncTypeBase = Union[Callable, str] -AggFuncTypeDict = Dict[Hashable, Union[AggFuncTypeBase, List[AggFuncTypeBase]]] +AggFuncTypeDict = dict[Hashable, Union[AggFuncTypeBase, list[AggFuncTypeBase]]] AggFuncType = Union[ AggFuncTypeBase, - List[AggFuncTypeBase], + list[AggFuncTypeBase], AggFuncTypeDict, ] AggObjType = Union[ @@ -286,18 +285,18 @@ def closed(self) -> bool: FilePath = Union[str, "PathLike[str]"] # for arbitrary kwargs passed during reading/writing files -StorageOptions = Optional[Dict[str, Any]] +StorageOptions = Optional[dict[str, Any]] # compression keywords and compression -CompressionDict = Dict[str, Any] +CompressionDict = dict[str, Any] CompressionOptions = Optional[ Union[Literal["infer", "gzip", "bz2", "zip", "xz", "zstd", "tar"], CompressionDict] ] # types in DataFrameFormatter FormattersType = Union[ - List[Callable], Tuple[Callable, ...], Mapping[Union[str, int], Callable] + list[Callable], tuple[Callable, ...], Mapping[Union[str, int], Callable] ] ColspaceType = Mapping[Hashable, Union[str, int]] FloatFormatType = Union[str, Callable, "EngFormatter"] @@ -347,9 +346,9 @@ def closed(self) -> bool: # https://bugs.python.org/issue41810 # Using List[int] here rather than Sequence[int] to disallow tuples. ScalarIndexer = Union[int, np.integer] -SequenceIndexer = Union[slice, List[int], np.ndarray] +SequenceIndexer = Union[slice, list[int], np.ndarray] PositionalIndexer = Union[ScalarIndexer, SequenceIndexer] -PositionalIndexerTuple = Tuple[PositionalIndexer, PositionalIndexer] +PositionalIndexerTuple = tuple[PositionalIndexer, PositionalIndexer] PositionalIndexer2D = Union[PositionalIndexer, PositionalIndexerTuple] if TYPE_CHECKING: TakeIndexer = Union[Sequence[int], Sequence[np.integer], npt.NDArray[np.integer]] diff --git a/pandas/_version.py b/pandas/_version.py index 8c655648377c7..5d610b5e1ea7e 100644 --- a/pandas/_version.py +++ b/pandas/_version.py @@ -16,10 +16,7 @@ import re import subprocess import sys -from typing import ( - Callable, - Dict, -) +from typing import Callable def get_keywords(): @@ -57,8 +54,8 @@ class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} +LONG_VERSION_PY: dict[str, str] = {} +HANDLERS: dict[str, dict[str, Callable]] = {} def register_vcs_handler(vcs, method): # decorator diff --git a/pandas/compat/pickle_compat.py b/pandas/compat/pickle_compat.py index c15dd7b37be93..8282ec25c1d58 100644 --- a/pandas/compat/pickle_compat.py +++ b/pandas/compat/pickle_compat.py @@ -7,7 +7,7 @@ import copy import io import pickle as pkl -from typing import Generator +from typing import TYPE_CHECKING import numpy as np @@ -22,6 +22,9 @@ ) from pandas.core.internals import BlockManager +if TYPE_CHECKING: + from collections.abc import Generator + def load_reduce(self): stack = self.stack diff --git a/pandas/conftest.py b/pandas/conftest.py index b2f1377a9fb32..d7e8fbeb9336b 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -32,9 +32,8 @@ import os from pathlib import Path from typing import ( + TYPE_CHECKING, Callable, - Hashable, - Iterator, ) from dateutil.tz import ( @@ -73,6 +72,12 @@ MultiIndex, ) +if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + ) + try: import pyarrow as pa except ImportError: diff --git a/pandas/core/apply.py b/pandas/core/apply.py index fc322312a9195..8a28b30aecc03 100644 --- a/pandas/core/apply.py +++ b/pandas/core/apply.py @@ -9,13 +9,7 @@ Any, Callable, DefaultDict, - Dict, - Hashable, - Iterable, - Iterator, - List, Literal, - Sequence, cast, ) import warnings @@ -59,6 +53,13 @@ from pandas.core.construction import ensure_wrapped_if_datetimelike if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Iterator, + Sequence, + ) + from pandas import ( DataFrame, Index, @@ -69,7 +70,7 @@ from pandas.core.window.rolling import BaseWindow -ResType = Dict[int, Any] +ResType = dict[int, Any] def frame_apply( @@ -213,7 +214,7 @@ def transform(self) -> DataFrame | Series: return obj.T.transform(func, 0, *args, **kwargs).T if is_list_like(func) and not is_dict_like(func): - func = cast(List[AggFuncTypeBase], func) + func = cast(list[AggFuncTypeBase], func) # Convert func equivalent dict if is_series: func = {com.get_callable_name(v) or v: v for v in func} @@ -335,7 +336,7 @@ def compute_list_like( Data for result. When aggregating with a Series, this can contain any Python objects. """ - func = cast(List[AggFuncTypeBase], self.func) + func = cast(list[AggFuncTypeBase], self.func) obj = self.obj results = [] diff --git a/pandas/core/array_algos/replace.py b/pandas/core/array_algos/replace.py index 85d1f7ccf2e88..5f377276be480 100644 --- a/pandas/core/array_algos/replace.py +++ b/pandas/core/array_algos/replace.py @@ -5,10 +5,10 @@ import operator import re +from re import Pattern from typing import ( TYPE_CHECKING, Any, - Pattern, ) import numpy as np diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index f586de3d2bdee..f987bab7a2b87 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -5,7 +5,6 @@ TYPE_CHECKING, Any, Literal, - Sequence, cast, overload, ) @@ -58,6 +57,8 @@ from pandas.core.sorting import nargminmax if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( NumpySorter, NumpyValueArrayLike, diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 284044dfadfef..e2630fd61072b 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1,16 +1,13 @@ from __future__ import annotations -import functools import operator import re -import sys import textwrap from typing import ( TYPE_CHECKING, Any, Callable, Literal, - Sequence, cast, ) import unicodedata @@ -127,6 +124,8 @@ def floordiv_compat( } if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( ArrayLike, AxisInt, @@ -2189,14 +2188,7 @@ def _str_removeprefix(self, prefix: str): # removed = pc.utf8_slice_codeunits(self._pa_array, len(prefix)) # result = pc.if_else(starts_with, removed, self._pa_array) # return type(self)(result) - if sys.version_info < (3, 9): - # NOTE pyupgrade will remove this when we run it with --py39-plus - # so don't remove the unnecessary `else` statement below - from pandas.util._str_methods import removeprefix - - predicate = functools.partial(removeprefix, prefix=prefix) - else: - predicate = lambda val: val.removeprefix(prefix) + predicate = lambda val: val.removeprefix(prefix) result = self._apply_elementwise(predicate) return type(self)(pa.chunked_array(result)) diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index 64f917a419391..c82f2ac018f93 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -14,9 +14,7 @@ Any, Callable, ClassVar, - Iterator, Literal, - Sequence, cast, overload, ) @@ -75,6 +73,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Sequence, + ) + from pandas._typing import ( ArrayLike, AstypeArg, diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index fdf4434d89f4c..6c61ce7a3e99b 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -6,10 +6,7 @@ from shutil import get_terminal_size from typing import ( TYPE_CHECKING, - Hashable, - Iterator, Literal, - Sequence, cast, overload, ) @@ -93,6 +90,12 @@ from pandas.io.formats import console if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + Sequence, + ) + from pandas._typing import ( ArrayLike, AstypeArg, diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 40cd59340f942..3274b822f3bd7 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -10,9 +10,7 @@ TYPE_CHECKING, Any, Callable, - Iterator, Literal, - Sequence, Union, cast, final, @@ -144,6 +142,11 @@ from pandas.tseries import frequencies if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Sequence, + ) + from pandas import Index from pandas.core.arrays import ( DatetimeArray, diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 3427ba025118a..8ad51e4a90027 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -2,13 +2,11 @@ from datetime import ( datetime, - time, timedelta, tzinfo, ) from typing import ( TYPE_CHECKING, - Iterator, cast, ) import warnings @@ -72,6 +70,8 @@ ) if TYPE_CHECKING: + from collections.abc import Iterator + from pandas._typing import ( DateTimeErrorChoices, IntervalClosedType, @@ -84,8 +84,6 @@ from pandas import DataFrame from pandas.core.arrays import PeriodArray -_midnight = time(0, 0) - def tz_to_dtype( tz: tzinfo | None, unit: str = "ns" diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index 446c0957db343..7c0263660ef55 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -8,9 +8,7 @@ import textwrap from typing import ( TYPE_CHECKING, - Iterator, Literal, - Sequence, Union, overload, ) @@ -100,6 +98,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Sequence, + ) + from pandas import ( Index, Series, diff --git a/pandas/core/arrays/masked.py b/pandas/core/arrays/masked.py index 15c485cbb1499..d24aa95cdd6c5 100644 --- a/pandas/core/arrays/masked.py +++ b/pandas/core/arrays/masked.py @@ -3,9 +3,7 @@ from typing import ( TYPE_CHECKING, Any, - Iterator, Literal, - Sequence, overload, ) import warnings @@ -83,6 +81,10 @@ from pandas.core.ops import invalid_comparison if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Sequence, + ) from pandas import Series from pandas.core.arrays import BooleanArray from pandas._typing import ( diff --git a/pandas/core/arrays/numeric.py b/pandas/core/arrays/numeric.py index d6adb0315a2e3..0e86c1efba17a 100644 --- a/pandas/core/arrays/numeric.py +++ b/pandas/core/arrays/numeric.py @@ -5,7 +5,6 @@ TYPE_CHECKING, Any, Callable, - Mapping, ) import numpy as np @@ -29,6 +28,8 @@ ) if TYPE_CHECKING: + from collections.abc import Mapping + import pyarrow from pandas._typing import ( diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index c9c2d258a9a16..c22e74876f58f 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -7,7 +7,6 @@ Any, Callable, Literal, - Sequence, TypeVar, cast, overload, @@ -74,6 +73,8 @@ import pandas.core.common as com if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( AnyArrayLike, Dtype, diff --git a/pandas/core/arrays/sparse/array.py b/pandas/core/arrays/sparse/array.py index aba6811c5eeb7..6b48a9181a5a8 100644 --- a/pandas/core/arrays/sparse/array.py +++ b/pandas/core/arrays/sparse/array.py @@ -11,7 +11,6 @@ Any, Callable, Literal, - Sequence, cast, overload, ) @@ -86,6 +85,7 @@ # See https://github.com/python/typing/issues/684 if TYPE_CHECKING: + from collections.abc import Sequence from enum import Enum class ellipsis(Enum): diff --git a/pandas/core/arrays/sparse/scipy_sparse.py b/pandas/core/arrays/sparse/scipy_sparse.py index 7f6a9c589c486..71b71a9779da5 100644 --- a/pandas/core/arrays/sparse/scipy_sparse.py +++ b/pandas/core/arrays/sparse/scipy_sparse.py @@ -5,10 +5,7 @@ """ from __future__ import annotations -from typing import ( - TYPE_CHECKING, - Iterable, -) +from typing import TYPE_CHECKING from pandas._libs import lib @@ -19,6 +16,8 @@ from pandas.core.series import Series if TYPE_CHECKING: + from collections.abc import Iterable + import numpy as np import scipy.sparse diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index debac4dd5243e..a81609e1bb618 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -4,7 +4,6 @@ import operator from typing import ( TYPE_CHECKING, - Iterator, cast, ) import warnings @@ -67,6 +66,8 @@ from pandas.core.ops.common import unpack_zerodim_and_defer if TYPE_CHECKING: + from collections.abc import Iterator + from pandas._typing import ( AxisInt, DateTimeErrorChoices, diff --git a/pandas/core/base.py b/pandas/core/base.py index 3710a644c7826..3629a6f9526af 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -9,8 +9,6 @@ TYPE_CHECKING, Any, Generic, - Hashable, - Iterator, Literal, cast, final, @@ -69,6 +67,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + ) + from pandas._typing import ( DropKeep, NumpySorter, diff --git a/pandas/core/common.py b/pandas/core/common.py index c1d78f7c19c98..11c6d8ea1a821 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -10,6 +10,13 @@ abc, defaultdict, ) +from collections.abc import ( + Collection, + Generator, + Hashable, + Iterable, + Sequence, +) import contextlib from functools import partial import inspect @@ -17,11 +24,6 @@ TYPE_CHECKING, Any, Callable, - Collection, - Generator, - Hashable, - Iterable, - Sequence, cast, overload, ) diff --git a/pandas/core/computation/align.py b/pandas/core/computation/align.py index a8ca08c58c261..85d412d044ba8 100644 --- a/pandas/core/computation/align.py +++ b/pandas/core/computation/align.py @@ -10,7 +10,6 @@ from typing import ( TYPE_CHECKING, Callable, - Sequence, ) import warnings @@ -29,6 +28,8 @@ from pandas.core.computation.common import result_type_many if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import F from pandas.core.generic import NDFrame diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index dd7f9c3f76049..b14187b0cc3a5 100644 --- a/pandas/core/computation/ops.py +++ b/pandas/core/computation/ops.py @@ -8,9 +8,8 @@ from functools import partial import operator from typing import ( + TYPE_CHECKING, Callable, - Iterable, - Iterator, Literal, ) @@ -35,6 +34,12 @@ pprint_thing_encoded, ) +if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Iterator, + ) + REDUCTIONS = ("sum", "prod", "min", "max") _unary_math_ops = ( diff --git a/pandas/core/computation/parsing.py b/pandas/core/computation/parsing.py index 4020ec7b5e9eb..4cfa0f2baffd5 100644 --- a/pandas/core/computation/parsing.py +++ b/pandas/core/computation/parsing.py @@ -7,10 +7,13 @@ from keyword import iskeyword import token import tokenize -from typing import ( - Hashable, - Iterator, -) +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + ) # A token value Python's tokenizer probably will never use. BACKTICK_QUOTED_STRING = 100 diff --git a/pandas/core/computation/scope.py b/pandas/core/computation/scope.py index 0b9ba84cae511..7e553ca448218 100644 --- a/pandas/core/computation/scope.py +++ b/pandas/core/computation/scope.py @@ -3,6 +3,7 @@ """ from __future__ import annotations +from collections import ChainMap import datetime import inspect from io import StringIO @@ -10,10 +11,7 @@ import pprint import struct import sys -from typing import ( - ChainMap, - TypeVar, -) +from typing import TypeVar import numpy as np diff --git a/pandas/core/construction.py b/pandas/core/construction.py index 34f8ef500be86..014c99c87ad00 100644 --- a/pandas/core/construction.py +++ b/pandas/core/construction.py @@ -6,10 +6,10 @@ """ from __future__ import annotations +from collections.abc import Sequence from typing import ( TYPE_CHECKING, Optional, - Sequence, Union, cast, overload, diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index a73362cadb93a..22c2aa374263d 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -10,8 +10,6 @@ TYPE_CHECKING, Any, Literal, - Sequence, - Sized, TypeVar, cast, overload, @@ -82,6 +80,11 @@ from pandas.io._util import _arrow_dtype_mapping if TYPE_CHECKING: + from collections.abc import ( + Sequence, + Sized, + ) + from pandas._typing import ( ArrayLike, Dtype, diff --git a/pandas/core/dtypes/concat.py b/pandas/core/dtypes/concat.py index cba7c44a219bf..c733d4578ca04 100644 --- a/pandas/core/dtypes/concat.py +++ b/pandas/core/dtypes/concat.py @@ -5,7 +5,6 @@ from typing import ( TYPE_CHECKING, - Sequence, cast, ) @@ -26,6 +25,8 @@ ) if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( ArrayLike, AxisInt, diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py index ea4d10c06efe3..074cff5b6564a 100644 --- a/pandas/core/dtypes/dtypes.py +++ b/pandas/core/dtypes/dtypes.py @@ -14,7 +14,6 @@ from typing import ( TYPE_CHECKING, Any, - MutableMapping, cast, ) import warnings @@ -65,6 +64,7 @@ import pyarrow as pa if TYPE_CHECKING: + from collections.abc import MutableMapping from datetime import tzinfo import pyarrow as pa # noqa: F811, TCH004 diff --git a/pandas/core/dtypes/inference.py b/pandas/core/dtypes/inference.py index af4f0a1c0aa05..9c04e57be36fc 100644 --- a/pandas/core/dtypes/inference.py +++ b/pandas/core/dtypes/inference.py @@ -5,17 +5,16 @@ from collections import abc from numbers import Number import re -from typing import ( - TYPE_CHECKING, - Hashable, - Pattern, -) +from re import Pattern +from typing import TYPE_CHECKING import numpy as np from pandas._libs import lib if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import TypeGuard is_bool = lib.is_bool diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 6fdd6cb2a639e..c0f4dbb4aeb2d 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -12,6 +12,13 @@ import collections from collections import abc +from collections.abc import ( + Hashable, + Iterable, + Iterator, + Mapping, + Sequence, +) import functools from io import StringIO import itertools @@ -22,12 +29,7 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, - Iterator, Literal, - Mapping, - Sequence, cast, overload, ) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 8f213a1b7a1e2..010bd0cd79de9 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -15,13 +15,8 @@ Any, Callable, ClassVar, - Hashable, - Iterator, Literal, - Mapping, NoReturn, - Sequence, - Type, cast, final, overload, @@ -202,6 +197,13 @@ from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + Mapping, + Sequence, + ) + from pandas._libs.tslibs import BaseOffset from pandas import ( @@ -6866,7 +6868,7 @@ def convert_dtypes( ] if len(results) > 0: result = concat(results, axis=1, copy=False, keys=self.columns) - cons = cast(Type["DataFrame"], self._constructor) + cons = cast(type["DataFrame"], self._constructor) result = cons(result) result = result.__finalize__(self, method="convert_dtypes") # https://github.com/python/mypy/issues/8354 diff --git a/pandas/core/groupby/base.py b/pandas/core/groupby/base.py index 0f6d39be7d32f..a443597347283 100644 --- a/pandas/core/groupby/base.py +++ b/pandas/core/groupby/base.py @@ -4,7 +4,10 @@ from __future__ import annotations import dataclasses -from typing import Hashable +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Hashable @dataclasses.dataclass(order=True, frozen=True) diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 3bedcb935b6ba..8691866bac752 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -14,11 +14,8 @@ TYPE_CHECKING, Any, Callable, - Hashable, Literal, - Mapping, NamedTuple, - Sequence, TypeVar, Union, cast, @@ -92,6 +89,12 @@ from pandas.plotting import boxplot_frame_groupby if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Mapping, + Sequence, + ) + from pandas._typing import ( ArrayLike, Axis, diff --git a/pandas/core/groupby/groupby.py b/pandas/core/groupby/groupby.py index ff9c1cf757f37..85ec8c1b86374 100644 --- a/pandas/core/groupby/groupby.py +++ b/pandas/core/groupby/groupby.py @@ -8,6 +8,12 @@ class providing the base-class of operations. """ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterator, + Mapping, + Sequence, +) import datetime from functools import ( partial, @@ -18,12 +24,7 @@ class providing the base-class of operations. from typing import ( TYPE_CHECKING, Callable, - Hashable, - Iterator, - List, Literal, - Mapping, - Sequence, TypeVar, Union, cast, @@ -685,9 +686,9 @@ def f(self): _KeysArgType = Union[ Hashable, - List[Hashable], + list[Hashable], Callable[[Hashable], Hashable], - List[Callable[[Hashable], Hashable]], + list[Callable[[Hashable], Hashable]], Mapping[Hashable, Hashable], ] diff --git a/pandas/core/groupby/grouper.py b/pandas/core/groupby/grouper.py index 316b896da126f..764b74f81e7ef 100644 --- a/pandas/core/groupby/grouper.py +++ b/pandas/core/groupby/grouper.py @@ -6,8 +6,6 @@ from typing import ( TYPE_CHECKING, - Hashable, - Iterator, final, ) import warnings @@ -46,6 +44,11 @@ from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + ) + from pandas._typing import ( ArrayLike, Axis, diff --git a/pandas/core/groupby/indexing.py b/pandas/core/groupby/indexing.py index 61e88565f8e33..a3c5ab8edc94e 100644 --- a/pandas/core/groupby/indexing.py +++ b/pandas/core/groupby/indexing.py @@ -1,8 +1,8 @@ from __future__ import annotations +from collections.abc import Iterable from typing import ( TYPE_CHECKING, - Iterable, Literal, cast, ) diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index f0e4484f69f8d..3c4a22d009406 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -13,9 +13,6 @@ TYPE_CHECKING, Callable, Generic, - Hashable, - Iterator, - Sequence, final, ) @@ -71,6 +68,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + Sequence, + ) + from pandas.core.generic import NDFrame diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 5f19f6d06a194..73559e80cbcc6 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -9,11 +9,8 @@ Any, Callable, ClassVar, - Hashable, - Iterable, Literal, NoReturn, - Sequence, cast, final, overload, @@ -189,6 +186,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Sequence, + ) + from pandas import ( CategoricalIndex, DataFrame, diff --git a/pandas/core/indexes/category.py b/pandas/core/indexes/category.py index 9bd0bc98dc733..648a3ad5b3bd7 100644 --- a/pandas/core/indexes/category.py +++ b/pandas/core/indexes/category.py @@ -3,7 +3,6 @@ from typing import ( TYPE_CHECKING, Any, - Hashable, Literal, cast, ) @@ -42,6 +41,8 @@ from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( Dtype, DtypeObj, diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index c4be04c469fae..1617b7c750c3c 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -11,7 +11,6 @@ TYPE_CHECKING, Any, Callable, - Sequence, cast, final, ) @@ -65,6 +64,7 @@ from pandas.core.tools.timedeltas import to_timedelta if TYPE_CHECKING: + from collections.abc import Sequence from datetime import datetime from pandas._typing import ( diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 1500bcef5d4d9..62b4dbded50ab 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -2,10 +2,7 @@ import datetime as dt import operator -from typing import ( - TYPE_CHECKING, - Hashable, -) +from typing import TYPE_CHECKING import warnings import numpy as np @@ -50,6 +47,8 @@ from pandas.core.tools.times import to_time if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( Dtype, DtypeObj, diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 50838f8c65881..13e907741d233 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -9,7 +9,6 @@ from typing import ( TYPE_CHECKING, Any, - Hashable, Literal, ) @@ -88,6 +87,8 @@ ) if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( Dtype, DtypeObj, diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 824ffa5cf4c67..d060ad24da2da 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1,19 +1,19 @@ from __future__ import annotations +from collections.abc import ( + Collection, + Generator, + Hashable, + Iterable, + Sequence, +) from functools import wraps from sys import getsizeof from typing import ( TYPE_CHECKING, Any, Callable, - Collection, - Generator, - Hashable, - Iterable, - List, Literal, - Sequence, - Tuple, cast, ) import warnings @@ -587,7 +587,7 @@ def from_tuples( raise TypeError("Input must be a list / sequence of tuple-likes.") if is_iterator(tuples): tuples = list(tuples) - tuples = cast(Collection[Tuple[Hashable, ...]], tuples) + tuples = cast(Collection[tuple[Hashable, ...]], tuples) # handling the empty tuple cases if len(tuples) and all(isinstance(e, tuple) and not e for e in tuples): @@ -617,7 +617,7 @@ def from_tuples( arrays = list(lib.to_object_array_tuples(tuples).T) else: arrs = zip(*tuples) - arrays = cast(List[Sequence[Hashable]], arrs) + arrays = cast(list[Sequence[Hashable]], arrs) return cls.from_arrays(arrays, sortorder=sortorder, names=names) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index fd7cab0344e42..bb39cdbdce262 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -4,10 +4,7 @@ datetime, timedelta, ) -from typing import ( - TYPE_CHECKING, - Hashable, -) +from typing import TYPE_CHECKING import numpy as np @@ -46,6 +43,8 @@ from pandas.core.indexes.extension import inherit_names if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( Dtype, DtypeObj, diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 2b0dc53a736ea..fe66ec9c6792b 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -1,5 +1,9 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterator, +) from datetime import timedelta import operator from sys import getsizeof @@ -7,9 +11,6 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterator, - List, cast, ) @@ -910,7 +911,7 @@ def _concat(self, indexes: list[Index], name: Hashable) -> Index: elif len(indexes) == 1: return indexes[0] - rng_indexes = cast(List[RangeIndex], indexes) + rng_indexes = cast(list[RangeIndex], indexes) start = step = next_ = None diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 4a2803f638c73..9fb83b3d55df9 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -4,8 +4,6 @@ import sys from typing import ( TYPE_CHECKING, - Hashable, - Sequence, cast, final, ) @@ -75,6 +73,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) + from pandas._typing import ( Axis, AxisInt, diff --git a/pandas/core/interchange/dataframe_protocol.py b/pandas/core/interchange/dataframe_protocol.py index d36bda120e33d..95e7b6a26f93a 100644 --- a/pandas/core/interchange/dataframe_protocol.py +++ b/pandas/core/interchange/dataframe_protocol.py @@ -10,12 +10,17 @@ ) import enum from typing import ( + TYPE_CHECKING, Any, - Iterable, - Sequence, TypedDict, ) +if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Sequence, + ) + class DlpackDeviceType(enum.IntEnum): """Integer enum for device type codes matching DLPack.""" diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 431de70a25392..5591253618f5f 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -7,7 +7,6 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, Literal, ) @@ -90,6 +89,8 @@ from pandas.core.internals.managers import make_na_array if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( ArrayLike, AxisInt, diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 4480a1a0c6746..fee8314796dfe 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -6,9 +6,7 @@ TYPE_CHECKING, Any, Callable, - Iterable, Literal, - Sequence, cast, final, ) @@ -117,6 +115,11 @@ from pandas.core.indexers import check_setitem_lengths if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Sequence, + ) + from pandas.core.api import Index from pandas.core.arrays._mixins import NDArrayBackedExtensionArray diff --git a/pandas/core/internals/concat.py b/pandas/core/internals/concat.py index 8d12fb91887ac..294ef96a9aab9 100644 --- a/pandas/core/internals/concat.py +++ b/pandas/core/internals/concat.py @@ -2,7 +2,6 @@ from typing import ( TYPE_CHECKING, - Sequence, cast, ) import warnings @@ -51,6 +50,8 @@ ) if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( ArrayLike, AxisInt, diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index 7dcb33780dd08..ee85bc5a87834 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -8,8 +8,6 @@ from typing import ( TYPE_CHECKING, Any, - Hashable, - Sequence, ) import numpy as np @@ -77,6 +75,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) + from pandas._typing import ( ArrayLike, DtypeObj, diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 0d24f742b97c7..b25eba15dfc06 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -1,12 +1,14 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Sequence, +) import itertools from typing import ( TYPE_CHECKING, Callable, - Hashable, Literal, - Sequence, cast, ) import warnings diff --git a/pandas/core/internals/ops.py b/pandas/core/internals/ops.py index 8434ed05571b7..cf9466c0bdf0b 100644 --- a/pandas/core/internals/ops.py +++ b/pandas/core/internals/ops.py @@ -2,13 +2,14 @@ from typing import ( TYPE_CHECKING, - Iterator, NamedTuple, ) from pandas.core.dtypes.common import is_1d_only_ea_dtype if TYPE_CHECKING: + from collections.abc import Iterator + from pandas._libs.internals import BlockPlacement from pandas._typing import ArrayLike diff --git a/pandas/core/methods/describe.py b/pandas/core/methods/describe.py index 71693f5b9195c..7b2c71ac1ca3c 100644 --- a/pandas/core/methods/describe.py +++ b/pandas/core/methods/describe.py @@ -12,8 +12,6 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, - Sequence, cast, ) @@ -43,6 +41,11 @@ from pandas.io.formats.format import format_percentiles if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) + from pandas import ( DataFrame, Series, diff --git a/pandas/core/methods/selectn.py b/pandas/core/methods/selectn.py index 56dd9fa7658bc..894791cb46371 100644 --- a/pandas/core/methods/selectn.py +++ b/pandas/core/methods/selectn.py @@ -4,10 +4,12 @@ from __future__ import annotations -from typing import ( - TYPE_CHECKING, +from collections.abc import ( Hashable, Sequence, +) +from typing import ( + TYPE_CHECKING, cast, final, ) diff --git a/pandas/core/ops/common.py b/pandas/core/ops/common.py index f8f53310e773b..559977bacf881 100644 --- a/pandas/core/ops/common.py +++ b/pandas/core/ops/common.py @@ -4,7 +4,6 @@ from __future__ import annotations from functools import wraps -import sys from typing import ( TYPE_CHECKING, Callable, @@ -57,15 +56,7 @@ def _unpack_zerodim_and_defer(method, name: str): ------- method """ - if sys.version_info < (3, 9): - from pandas.util._str_methods import ( - removeprefix, - removesuffix, - ) - - stripped_name = removesuffix(removeprefix(name, "__"), "__") - else: - stripped_name = name.removeprefix("__").removesuffix("__") + stripped_name = name.removeprefix("__").removesuffix("__") is_cmp = stripped_name in {"eq", "ne", "lt", "le", "gt", "ge"} @wraps(method) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index c0a6587d527e1..c48ad224d3645 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -5,7 +5,6 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, Literal, cast, final, @@ -86,6 +85,8 @@ ) if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import ( AnyArrayLike, Axis, diff --git a/pandas/core/reshape/concat.py b/pandas/core/reshape/concat.py index 81e3f575f6cb3..f6aedcbd67cba 100644 --- a/pandas/core/reshape/concat.py +++ b/pandas/core/reshape/concat.py @@ -7,10 +7,7 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, - Iterable, Literal, - Mapping, cast, overload, ) @@ -51,6 +48,12 @@ from pandas.core.internals import concatenate_managers if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Mapping, + ) + from pandas._typing import ( Axis, AxisInt, diff --git a/pandas/core/reshape/encoding.py b/pandas/core/reshape/encoding.py index 58209c357b65d..8c464c2229515 100644 --- a/pandas/core/reshape/encoding.py +++ b/pandas/core/reshape/encoding.py @@ -1,12 +1,12 @@ from __future__ import annotations from collections import defaultdict -import itertools -from typing import ( - TYPE_CHECKING, +from collections.abc import ( Hashable, Iterable, ) +import itertools +from typing import TYPE_CHECKING import numpy as np diff --git a/pandas/core/reshape/melt.py b/pandas/core/reshape/melt.py index 8e61754002cdb..cd0dc313a7fb3 100644 --- a/pandas/core/reshape/melt.py +++ b/pandas/core/reshape/melt.py @@ -1,10 +1,7 @@ from __future__ import annotations import re -from typing import ( - TYPE_CHECKING, - Hashable, -) +from typing import TYPE_CHECKING import numpy as np @@ -27,6 +24,8 @@ from pandas.core.tools.numeric import to_numeric if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._typing import AnyArrayLike from pandas import DataFrame diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index cfaa5a1fdad64..a4ef3013af249 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -3,14 +3,16 @@ """ from __future__ import annotations +from collections.abc import ( + Hashable, + Sequence, +) import datetime from functools import partial import string from typing import ( TYPE_CHECKING, - Hashable, Literal, - Sequence, cast, final, ) diff --git a/pandas/core/reshape/pivot.py b/pandas/core/reshape/pivot.py index 2852ca8cf576a..099bfde7af1d3 100644 --- a/pandas/core/reshape/pivot.py +++ b/pandas/core/reshape/pivot.py @@ -1,10 +1,12 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Sequence, +) from typing import ( TYPE_CHECKING, Callable, - Hashable, - Sequence, cast, ) diff --git a/pandas/core/series.py b/pandas/core/series.py index 2fc926d7e43d1..5da054a956603 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -3,6 +3,12 @@ """ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterable, + Mapping, + Sequence, +) import operator import sys from textwrap import dedent @@ -11,11 +17,7 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, Literal, - Mapping, - Sequence, Union, cast, overload, diff --git a/pandas/core/sorting.py b/pandas/core/sorting.py index 0dc230f760437..bc6e29c3c7fbf 100644 --- a/pandas/core/sorting.py +++ b/pandas/core/sorting.py @@ -6,9 +6,6 @@ TYPE_CHECKING, Callable, DefaultDict, - Hashable, - Iterable, - Sequence, cast, ) @@ -34,6 +31,12 @@ from pandas.core.construction import extract_array if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Sequence, + ) + from pandas._typing import ( ArrayLike, AxisInt, diff --git a/pandas/core/strings/accessor.py b/pandas/core/strings/accessor.py index 24fe7e6bfc0c1..abd0dceb6e35d 100644 --- a/pandas/core/strings/accessor.py +++ b/pandas/core/strings/accessor.py @@ -6,7 +6,6 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, Literal, cast, ) @@ -49,6 +48,8 @@ from pandas.core.construction import extract_array if TYPE_CHECKING: + from collections.abc import Hashable + from pandas import ( DataFrame, Index, diff --git a/pandas/core/strings/base.py b/pandas/core/strings/base.py index 44b311ad96387..96b0352666b41 100644 --- a/pandas/core/strings/base.py +++ b/pandas/core/strings/base.py @@ -5,12 +5,12 @@ TYPE_CHECKING, Callable, Literal, - Sequence, ) import numpy as np if TYPE_CHECKING: + from collections.abc import Sequence import re from pandas._typing import Scalar diff --git a/pandas/core/strings/object_array.py b/pandas/core/strings/object_array.py index 87cc6e71b8672..6993ae3235943 100644 --- a/pandas/core/strings/object_array.py +++ b/pandas/core/strings/object_array.py @@ -2,13 +2,11 @@ import functools import re -import sys import textwrap from typing import ( TYPE_CHECKING, Callable, Literal, - Sequence, cast, ) import unicodedata @@ -24,6 +22,8 @@ from pandas.core.strings.base import BaseStringArrayMethods if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( NpDtype, Scalar, @@ -469,14 +469,7 @@ def removeprefix(text: str) -> str: return self._str_map(removeprefix) def _str_removesuffix(self, suffix: str) -> Series: - if sys.version_info < (3, 9): - # NOTE pyupgrade will remove this when we run it with --py39-plus - # so don't remove the unnecessary `else` statement below - from pandas.util._str_methods import removesuffix - - return self._str_map(functools.partial(removesuffix, suffix=suffix)) - else: - return self._str_map(lambda x: x.removesuffix(suffix)) + return self._str_map(lambda x: x.removesuffix(suffix)) def _str_extract(self, pat: str, flags: int = 0, expand: bool = True): regex = re.compile(pat, flags=flags) diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index 13a434812db3b..6cde744d5704f 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -7,9 +7,6 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, - List, - Tuple, TypedDict, Union, cast, @@ -82,6 +79,8 @@ from pandas.core.indexes.datetimes import DatetimeIndex if TYPE_CHECKING: + from collections.abc import Hashable + from pandas._libs.tslibs.nattype import NaTType from pandas._libs.tslibs.timedeltas import UnitChoices @@ -93,13 +92,13 @@ # --------------------------------------------------------------------- # types used in annotations -ArrayConvertible = Union[List, Tuple, AnyArrayLike] +ArrayConvertible = Union[list, tuple, AnyArrayLike] Scalar = Union[float, str] DatetimeScalar = Union[Scalar, datetime] DatetimeScalarOrArrayConvertible = Union[DatetimeScalar, ArrayConvertible] -DatetimeDictArg = Union[List[Scalar], Tuple[Scalar, ...], AnyArrayLike] +DatetimeDictArg = Union[list[Scalar], tuple[Scalar, ...], AnyArrayLike] class YearMonthDayDict(TypedDict, total=True): diff --git a/pandas/core/util/hashing.py b/pandas/core/util/hashing.py index 5fd962da0ec48..676490693b121 100644 --- a/pandas/core/util/hashing.py +++ b/pandas/core/util/hashing.py @@ -4,12 +4,7 @@ from __future__ import annotations import itertools -from typing import ( - TYPE_CHECKING, - Hashable, - Iterable, - Iterator, -) +from typing import TYPE_CHECKING import numpy as np @@ -26,6 +21,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Iterator, + ) + from pandas._typing import ( ArrayLike, npt, diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 5fd9930da4463..d26c405a34e87 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -13,9 +13,6 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterator, - Sized, cast, ) @@ -93,6 +90,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + Sized, + ) + from pandas._typing import ( ArrayLike, Axis, diff --git a/pandas/io/common.py b/pandas/io/common.py index 6199491be71a5..0d0191b22c023 100644 --- a/pandas/io/common.py +++ b/pandas/io/common.py @@ -7,6 +7,11 @@ ) import codecs from collections import defaultdict +from collections.abc import ( + Hashable, + Mapping, + Sequence, +) import dataclasses import functools import gzip @@ -29,10 +34,7 @@ AnyStr, DefaultDict, Generic, - Hashable, Literal, - Mapping, - Sequence, TypeVar, cast, overload, diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 8383449ff21f1..10eea5e139387 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -1,6 +1,12 @@ from __future__ import annotations import abc +from collections.abc import ( + Hashable, + Iterable, + Mapping, + Sequence, +) import datetime from functools import partial from io import BytesIO @@ -11,12 +17,7 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, - List, Literal, - Mapping, - Sequence, Union, cast, overload, @@ -763,7 +764,7 @@ def parse( sheets = [sheet_name] # handle same-type duplicates. - sheets = cast(Union[List[int], List[str]], list(dict.fromkeys(sheets).keys())) + sheets = cast(Union[list[int], list[str]], list(dict.fromkeys(sheets).keys())) output = {} diff --git a/pandas/io/excel/_odswriter.py b/pandas/io/excel/_odswriter.py index f5aaf08530591..0333794d714aa 100644 --- a/pandas/io/excel/_odswriter.py +++ b/pandas/io/excel/_odswriter.py @@ -6,7 +6,6 @@ TYPE_CHECKING, Any, DefaultDict, - Tuple, cast, ) @@ -118,7 +117,7 @@ def _write_cells( self.book.spreadsheet.addElement(wks) if validate_freeze_panes(freeze_panes): - freeze_panes = cast(Tuple[int, int], freeze_panes) + freeze_panes = cast(tuple[int, int], freeze_panes) self._create_freeze_panes(sheet_name, freeze_panes) for _ in range(startrow): diff --git a/pandas/io/excel/_openpyxl.py b/pandas/io/excel/_openpyxl.py index 195d3a3a8b263..f94b82a0677ed 100644 --- a/pandas/io/excel/_openpyxl.py +++ b/pandas/io/excel/_openpyxl.py @@ -4,7 +4,6 @@ from typing import ( TYPE_CHECKING, Any, - Tuple, cast, ) @@ -478,7 +477,7 @@ def _write_cells( wks.title = sheet_name if validate_freeze_panes(freeze_panes): - freeze_panes = cast(Tuple[int, int], freeze_panes) + freeze_panes = cast(tuple[int, int], freeze_panes) wks.freeze_panes = wks.cell( row=freeze_panes[0] + 1, column=freeze_panes[1] + 1 ) diff --git a/pandas/io/excel/_util.py b/pandas/io/excel/_util.py index 72c64c5ec8939..f7a1fcb8052e3 100644 --- a/pandas/io/excel/_util.py +++ b/pandas/io/excel/_util.py @@ -1,14 +1,16 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterable, + MutableMapping, + Sequence, +) from typing import ( TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, Literal, - MutableMapping, - Sequence, TypeVar, overload, ) diff --git a/pandas/io/feather_format.py b/pandas/io/feather_format.py index 28df235084cf5..633c6f0f43889 100644 --- a/pandas/io/feather_format.py +++ b/pandas/io/feather_format.py @@ -1,11 +1,7 @@ """ feather-format compat """ from __future__ import annotations -from typing import ( - TYPE_CHECKING, - Hashable, - Sequence, -) +from typing import TYPE_CHECKING from pandas._libs import lib from pandas.compat._optional import import_optional_dependency @@ -19,6 +15,11 @@ from pandas.io.common import get_handle if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) + from pandas._typing import ( DtypeBackend, FilePath, diff --git a/pandas/io/formats/css.py b/pandas/io/formats/css.py index 98a8697740266..ccce60c00a9e0 100644 --- a/pandas/io/formats/css.py +++ b/pandas/io/formats/css.py @@ -5,16 +5,21 @@ import re from typing import ( + TYPE_CHECKING, Callable, - Generator, - Iterable, - Iterator, ) import warnings from pandas.errors import CSSWarning from pandas.util._exceptions import find_stack_level +if TYPE_CHECKING: + from collections.abc import ( + Generator, + Iterable, + Iterator, + ) + def _side_expander(prop_fmt: str) -> Callable: """ diff --git a/pandas/io/formats/csvs.py b/pandas/io/formats/csvs.py index 3b759010d1abb..ce6f9344bb8b2 100644 --- a/pandas/io/formats/csvs.py +++ b/pandas/io/formats/csvs.py @@ -4,14 +4,16 @@ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterator, + Sequence, +) import csv as csvlib import os from typing import ( TYPE_CHECKING, Any, - Hashable, - Iterator, - Sequence, cast, ) diff --git a/pandas/io/formats/excel.py b/pandas/io/formats/excel.py index 0dbb6529cd384..f3eb4f78fa74e 100644 --- a/pandas/io/formats/excel.py +++ b/pandas/io/formats/excel.py @@ -3,6 +3,12 @@ """ from __future__ import annotations +from collections.abc import ( + Hashable, + Iterable, + Mapping, + Sequence, +) import functools import itertools import re @@ -10,10 +16,6 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, - Mapping, - Sequence, cast, ) import warnings diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index 8caa9d0cbd3a5..3fa99027540a9 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -4,6 +4,13 @@ """ from __future__ import annotations +from collections.abc import ( + Generator, + Hashable, + Iterable, + Mapping, + Sequence, +) from contextlib import contextmanager from csv import ( QUOTE_NONE, @@ -21,12 +28,6 @@ Any, Callable, Final, - Generator, - Hashable, - Iterable, - List, - Mapping, - Sequence, cast, ) from unicodedata import east_asian_width @@ -856,7 +857,7 @@ def _get_strcols_without_index(self) -> list[list[str]]: if is_list_like(self.header): # cast here since can't be bool if is_list_like - self.header = cast(List[str], self.header) + self.header = cast(list[str], self.header) if len(self.header) != len(self.columns): raise ValueError( f"Writing {len(self.columns)} cols " diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py index 0ab02a81d4880..32a0cab1fbc41 100644 --- a/pandas/io/formats/html.py +++ b/pandas/io/formats/html.py @@ -5,11 +5,9 @@ from textwrap import dedent from typing import ( + TYPE_CHECKING, Any, Final, - Hashable, - Iterable, - Mapping, cast, ) @@ -29,6 +27,13 @@ ) from pandas.io.formats.printing import pprint_thing +if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Mapping, + ) + class HTMLFormatter: """ diff --git a/pandas/io/formats/info.py b/pandas/io/formats/info.py index 260620e145105..d20c2a62c61e2 100644 --- a/pandas/io/formats/info.py +++ b/pandas/io/formats/info.py @@ -6,13 +6,7 @@ ) import sys from textwrap import dedent -from typing import ( - TYPE_CHECKING, - Iterable, - Iterator, - Mapping, - Sequence, -) +from typing import TYPE_CHECKING from pandas._config import get_option @@ -20,6 +14,13 @@ from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Iterator, + Mapping, + Sequence, + ) + from pandas._typing import ( Dtype, WriteBuffer, diff --git a/pandas/io/formats/printing.py b/pandas/io/formats/printing.py index 828f3cf3735e9..7d9a3037c46f6 100644 --- a/pandas/io/formats/printing.py +++ b/pandas/io/formats/printing.py @@ -3,14 +3,15 @@ """ from __future__ import annotations +from collections.abc import ( + Iterable, + Mapping, + Sequence, +) import sys from typing import ( Any, Callable, - Dict, - Iterable, - Mapping, - Sequence, TypeVar, Union, ) @@ -498,7 +499,7 @@ def _justify( return head_tuples, tail_tuples -class PrettyDict(Dict[_KT, _VT]): +class PrettyDict(dict[_KT, _VT]): """Dict extension to support abbreviated __repr__""" def __repr__(self) -> str: diff --git a/pandas/io/formats/string.py b/pandas/io/formats/string.py index a4ec058467fb7..769f9dee1c31a 100644 --- a/pandas/io/formats/string.py +++ b/pandas/io/formats/string.py @@ -4,16 +4,15 @@ from __future__ import annotations from shutil import get_terminal_size -from typing import ( - TYPE_CHECKING, - Iterable, -) +from typing import TYPE_CHECKING import numpy as np from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from collections.abc import Iterable + from pandas.io.formats.format import DataFrameFormatter diff --git a/pandas/io/formats/style.py b/pandas/io/formats/style.py index c599bcbfd4170..426eda26588c7 100644 --- a/pandas/io/formats/style.py +++ b/pandas/io/formats/style.py @@ -11,9 +11,6 @@ TYPE_CHECKING, Any, Callable, - Generator, - Hashable, - Sequence, overload, ) import warnings @@ -60,6 +57,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Generator, + Hashable, + Sequence, + ) + from matplotlib.colors import Colormap from pandas._typing import ( diff --git a/pandas/io/formats/style_render.py b/pandas/io/formats/style_render.py index 7f2c237c8b296..07437fd231790 100644 --- a/pandas/io/formats/style_render.py +++ b/pandas/io/formats/style_render.py @@ -1,6 +1,7 @@ from __future__ import annotations from collections import defaultdict +from collections.abc import Sequence from functools import partial import re from typing import ( @@ -8,11 +9,7 @@ Any, Callable, DefaultDict, - Dict, - List, Optional, - Sequence, - Tuple, TypedDict, Union, ) @@ -52,9 +49,9 @@ from markupsafe import escape as escape_html # markupsafe is jinja2 dependency BaseFormatter = Union[str, Callable] -ExtFormatter = Union[BaseFormatter, Dict[Any, Optional[BaseFormatter]]] -CSSPair = Tuple[str, Union[str, float]] -CSSList = List[CSSPair] +ExtFormatter = Union[BaseFormatter, dict[Any, Optional[BaseFormatter]]] +CSSPair = tuple[str, Union[str, float]] +CSSList = list[CSSPair] CSSProperties = Union[str, CSSList] @@ -63,7 +60,7 @@ class CSSDict(TypedDict): props: CSSProperties -CSSStyles = List[CSSDict] +CSSStyles = list[CSSDict] Subset = Union[slice, Sequence, Index] diff --git a/pandas/io/html.py b/pandas/io/html.py index 606bdc5a326a2..6de0eb4d995e9 100644 --- a/pandas/io/html.py +++ b/pandas/io/html.py @@ -9,12 +9,10 @@ from collections import abc import numbers import re +from re import Pattern from typing import ( TYPE_CHECKING, - Iterable, Literal, - Pattern, - Sequence, cast, ) import warnings @@ -49,6 +47,11 @@ from pandas.io.parsers import TextParser if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Sequence, + ) + from pandas._typing import ( BaseBuffer, DtypeBackend, diff --git a/pandas/io/json/_json.py b/pandas/io/json/_json.py index eaeaedfdddfcb..7a2b327df447d 100644 --- a/pandas/io/json/_json.py +++ b/pandas/io/json/_json.py @@ -12,9 +12,7 @@ Any, Callable, Generic, - Hashable, Literal, - Mapping, TypeVar, overload, ) @@ -69,6 +67,10 @@ from pandas.io.parsers.readers import validate_integer if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Mapping, + ) from types import TracebackType from pandas._typing import ( diff --git a/pandas/io/json/_normalize.py b/pandas/io/json/_normalize.py index 459b4035627cc..b1e2210f9d894 100644 --- a/pandas/io/json/_normalize.py +++ b/pandas/io/json/_normalize.py @@ -7,12 +7,10 @@ defaultdict, ) import copy -import sys from typing import ( TYPE_CHECKING, Any, DefaultDict, - Iterable, ) import numpy as np @@ -23,6 +21,8 @@ from pandas import DataFrame if TYPE_CHECKING: + from collections.abc import Iterable + from pandas._typing import ( IgnoreRaise, Scalar, @@ -151,12 +151,7 @@ def _normalise_json( new_key = f"{key_string}{separator}{key}" if not key_string: - if sys.version_info < (3, 9): - from pandas.util._str_methods import removeprefix - - new_key = removeprefix(new_key, separator) - else: - new_key = new_key.removeprefix(separator) + new_key = new_key.removeprefix(separator) _normalise_json( data=value, diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 6cded2e21a43c..0a90deedf7ad2 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -10,12 +10,6 @@ TYPE_CHECKING, Any, Callable, - Hashable, - Iterable, - List, - Mapping, - Sequence, - Tuple, cast, final, overload, @@ -88,6 +82,13 @@ from pandas.io.common import is_potential_multi_index if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterable, + Mapping, + Sequence, + ) + from pandas._typing import ( ArrayLike, DtypeArg, @@ -353,7 +354,7 @@ def _maybe_make_multi_index_columns( ) -> Sequence[Hashable] | MultiIndex: # possibly create a column mi here if is_potential_multi_index(columns): - list_columns = cast(List[Tuple], columns) + list_columns = cast(list[tuple], columns) return MultiIndex.from_tuples(list_columns, names=col_names) return columns diff --git a/pandas/io/parsers/c_parser_wrapper.py b/pandas/io/parsers/c_parser_wrapper.py index cb3629ed0af4e..0cd788c5e5739 100644 --- a/pandas/io/parsers/c_parser_wrapper.py +++ b/pandas/io/parsers/c_parser_wrapper.py @@ -1,12 +1,7 @@ from __future__ import annotations from collections import defaultdict -from typing import ( - TYPE_CHECKING, - Hashable, - Mapping, - Sequence, -) +from typing import TYPE_CHECKING import warnings import numpy as np @@ -39,6 +34,12 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Mapping, + Sequence, + ) + from pandas._typing import ( ArrayLike, DtypeArg, diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index 36d5ef7111685..f2c9be66c0905 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -4,6 +4,12 @@ abc, defaultdict, ) +from collections.abc import ( + Hashable, + Iterator, + Mapping, + Sequence, +) import csv from io import StringIO import re @@ -12,12 +18,7 @@ IO, TYPE_CHECKING, DefaultDict, - Hashable, - Iterator, - List, Literal, - Mapping, - Sequence, cast, ) @@ -207,7 +208,7 @@ class MyDialect(csv.Dialect): self.pos += 1 line = f.readline() lines = self._check_comments([[line]])[0] - lines_str = cast(List[str], lines) + lines_str = cast(list[str], lines) # since `line` was a string, lines will be a list containing # only a single string diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index 0e4f85bfe3d63..e3c4fa3bbab96 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -14,11 +14,8 @@ TYPE_CHECKING, Any, Callable, - Hashable, Literal, - Mapping, NamedTuple, - Sequence, TypedDict, overload, ) @@ -66,6 +63,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Mapping, + Sequence, + ) from types import TracebackType from pandas._typing import ( diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index a67ff5274e0f7..e50a1f6e56d51 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -19,10 +19,7 @@ Any, Callable, Final, - Hashable, - Iterator, Literal, - Sequence, cast, overload, ) @@ -105,6 +102,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Iterator, + Sequence, + ) from types import TracebackType from tables import ( diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 2a395f790a5b5..4b31c4b3828ce 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -5,7 +5,6 @@ from typing import ( TYPE_CHECKING, - Hashable, Protocol, overload, ) @@ -17,6 +16,7 @@ from pandas.io.common import stringify_path if TYPE_CHECKING: + from collections.abc import Hashable from types import TracebackType from pandas._typing import ( diff --git a/pandas/io/spss.py b/pandas/io/spss.py index 876eb83890836..980a3e0aabe60 100644 --- a/pandas/io/spss.py +++ b/pandas/io/spss.py @@ -1,9 +1,6 @@ from __future__ import annotations -from typing import ( - TYPE_CHECKING, - Sequence, -) +from typing import TYPE_CHECKING from pandas._libs import lib from pandas.compat._optional import import_optional_dependency @@ -14,6 +11,7 @@ from pandas.io.common import stringify_path if TYPE_CHECKING: + from collections.abc import Sequence from pathlib import Path from pandas._typing import DtypeBackend diff --git a/pandas/io/sql.py b/pandas/io/sql.py index 719479754340b..4018a70fd0450 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -24,9 +24,7 @@ TYPE_CHECKING, Any, Callable, - Iterator, Literal, - Mapping, cast, overload, ) @@ -62,6 +60,11 @@ from pandas.core.tools.datetimes import to_datetime if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Mapping, + ) + from sqlalchemy import Table from sqlalchemy.sql.expression import ( Select, diff --git a/pandas/io/stata.py b/pandas/io/stata.py index d62830ffe3ea1..88d24fadd327b 100644 --- a/pandas/io/stata.py +++ b/pandas/io/stata.py @@ -27,8 +27,6 @@ AnyStr, Callable, Final, - Hashable, - Sequence, cast, ) import warnings @@ -75,6 +73,10 @@ from pandas.io.common import get_handle if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) from types import TracebackType from typing import Literal diff --git a/pandas/io/xml.py b/pandas/io/xml.py index 62bbb410dacc1..b950a56633ae1 100644 --- a/pandas/io/xml.py +++ b/pandas/io/xml.py @@ -10,7 +10,6 @@ TYPE_CHECKING, Any, Callable, - Sequence, ) from pandas._libs import lib @@ -37,6 +36,7 @@ from pandas.io.parsers import TextParser if TYPE_CHECKING: + from collections.abc import Sequence from xml.etree.ElementTree import Element from lxml import etree diff --git a/pandas/plotting/_core.py b/pandas/plotting/_core.py index 24b8816109677..fcea410971c91 100644 --- a/pandas/plotting/_core.py +++ b/pandas/plotting/_core.py @@ -4,9 +4,7 @@ from typing import ( TYPE_CHECKING, Callable, - Hashable, Literal, - Sequence, ) from pandas._config import get_option @@ -28,6 +26,10 @@ from pandas.core.base import PandasObject if TYPE_CHECKING: + from collections.abc import ( + Hashable, + Sequence, + ) import types from matplotlib.axes import Axes diff --git a/pandas/plotting/_matplotlib/boxplot.py b/pandas/plotting/_matplotlib/boxplot.py index 93e8146c947b2..83cb8a6ab67dd 100644 --- a/pandas/plotting/_matplotlib/boxplot.py +++ b/pandas/plotting/_matplotlib/boxplot.py @@ -2,7 +2,6 @@ from typing import ( TYPE_CHECKING, - Collection, Literal, NamedTuple, ) @@ -33,6 +32,8 @@ ) if TYPE_CHECKING: + from collections.abc import Collection + from matplotlib.axes import Axes from matplotlib.lines import Line2D diff --git a/pandas/plotting/_matplotlib/converter.py b/pandas/plotting/_matplotlib/converter.py index 9a4806ae51920..cd7823ba15e44 100644 --- a/pandas/plotting/_matplotlib/converter.py +++ b/pandas/plotting/_matplotlib/converter.py @@ -12,7 +12,6 @@ TYPE_CHECKING, Any, Final, - Generator, cast, ) @@ -57,6 +56,8 @@ import pandas.core.tools.datetimes as tools if TYPE_CHECKING: + from collections.abc import Generator + from pandas._libs.tslibs.offsets import BaseOffset # constants diff --git a/pandas/plotting/_matplotlib/core.py b/pandas/plotting/_matplotlib/core.py index f11d663f39cea..b2a2e1c59a175 100644 --- a/pandas/plotting/_matplotlib/core.py +++ b/pandas/plotting/_matplotlib/core.py @@ -4,13 +4,15 @@ ABC, abstractmethod, ) -from typing import ( - TYPE_CHECKING, +from collections.abc import ( Hashable, Iterable, - Literal, Sequence, ) +from typing import ( + TYPE_CHECKING, + Literal, +) import warnings import matplotlib as mpl diff --git a/pandas/plotting/_matplotlib/groupby.py b/pandas/plotting/_matplotlib/groupby.py index 94533d55d31df..00c3c4114d377 100644 --- a/pandas/plotting/_matplotlib/groupby.py +++ b/pandas/plotting/_matplotlib/groupby.py @@ -16,15 +16,12 @@ from pandas.plotting._matplotlib.misc import unpack_single_str_list if TYPE_CHECKING: - from pandas._typing import ( - Dict, - IndexLabel, - ) + from pandas._typing import IndexLabel def create_iter_data_given_by( data: DataFrame, kind: str = "hist" -) -> Dict[str, DataFrame | Series]: +) -> dict[str, DataFrame | Series]: """ Create data for iteration given `by` is assigned or not, and it is only used in both hist and boxplot. diff --git a/pandas/plotting/_matplotlib/misc.py b/pandas/plotting/_matplotlib/misc.py index 7db9acdc68d51..1f9212587e05e 100644 --- a/pandas/plotting/_matplotlib/misc.py +++ b/pandas/plotting/_matplotlib/misc.py @@ -1,10 +1,7 @@ from __future__ import annotations import random -from typing import ( - TYPE_CHECKING, - Hashable, -) +from typing import TYPE_CHECKING from matplotlib import patches import matplotlib.lines as mlines @@ -22,6 +19,8 @@ ) if TYPE_CHECKING: + from collections.abc import Hashable + from matplotlib.axes import Axes from matplotlib.figure import Figure diff --git a/pandas/plotting/_matplotlib/style.py b/pandas/plotting/_matplotlib/style.py index 839da35a8ae83..a5f34e9434cb7 100644 --- a/pandas/plotting/_matplotlib/style.py +++ b/pandas/plotting/_matplotlib/style.py @@ -1,10 +1,12 @@ from __future__ import annotations +from collections.abc import ( + Collection, + Iterator, +) import itertools from typing import ( TYPE_CHECKING, - Collection, - Iterator, cast, ) import warnings diff --git a/pandas/plotting/_matplotlib/tools.py b/pandas/plotting/_matplotlib/tools.py index 414a20cde62b6..8c0e401f991a6 100644 --- a/pandas/plotting/_matplotlib/tools.py +++ b/pandas/plotting/_matplotlib/tools.py @@ -2,11 +2,7 @@ from __future__ import annotations from math import ceil -from typing import ( - TYPE_CHECKING, - Iterable, - Sequence, -) +from typing import TYPE_CHECKING import warnings from matplotlib import ticker @@ -23,6 +19,11 @@ ) if TYPE_CHECKING: + from collections.abc import ( + Iterable, + Sequence, + ) + from matplotlib.axes import Axes from matplotlib.axis import Axis from matplotlib.figure import Figure diff --git a/pandas/plotting/_misc.py b/pandas/plotting/_misc.py index f8f9a584f0563..4c12a7ad01537 100644 --- a/pandas/plotting/_misc.py +++ b/pandas/plotting/_misc.py @@ -4,13 +4,16 @@ from typing import ( TYPE_CHECKING, Any, - Generator, - Mapping, ) from pandas.plotting._core import _get_plot_backend if TYPE_CHECKING: + from collections.abc import ( + Generator, + Mapping, + ) + from matplotlib.axes import Axes from matplotlib.colors import Colormap from matplotlib.figure import Figure diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index bbce40727c669..cadc3a46e0ba4 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -5,6 +5,7 @@ """ import collections from collections import namedtuple +from collections.abc import Iterator from datetime import ( date, datetime, @@ -20,7 +21,6 @@ import sys from typing import ( Generic, - Iterator, TypeVar, ) diff --git a/pandas/tests/extension/date/array.py b/pandas/tests/extension/date/array.py index 20373e323e2de..8c7b17cd8e3b8 100644 --- a/pandas/tests/extension/date/array.py +++ b/pandas/tests/extension/date/array.py @@ -4,7 +4,6 @@ from typing import ( TYPE_CHECKING, Any, - Sequence, cast, ) @@ -19,6 +18,8 @@ from pandas.api.types import pandas_dtype if TYPE_CHECKING: + from collections.abc import Sequence + from pandas._typing import ( Dtype, PositionalIndexer, diff --git a/pandas/tests/extension/json/array.py b/pandas/tests/extension/json/array.py index 9ce60ae5d435c..8495ffbbbe70d 100644 --- a/pandas/tests/extension/json/array.py +++ b/pandas/tests/extension/json/array.py @@ -25,7 +25,6 @@ from typing import ( TYPE_CHECKING, Any, - Mapping, ) import numpy as np @@ -45,6 +44,8 @@ from pandas.core.indexers import unpack_tuple_and_ellipses if TYPE_CHECKING: + from collections.abc import Mapping + from pandas._typing import type_t diff --git a/pandas/tests/frame/constructors/test_from_records.py b/pandas/tests/frame/constructors/test_from_records.py index 9f44e85789cbd..bd8f1ae5adf5b 100644 --- a/pandas/tests/frame/constructors/test_from_records.py +++ b/pandas/tests/frame/constructors/test_from_records.py @@ -1,6 +1,6 @@ +from collections.abc import Iterator from datetime import datetime from decimal import Decimal -from typing import Iterator import numpy as np import pytest diff --git a/pandas/tests/frame/test_constructors.py b/pandas/tests/frame/test_constructors.py index 3fbc6558b5c15..8a4d1624fcb30 100644 --- a/pandas/tests/frame/test_constructors.py +++ b/pandas/tests/frame/test_constructors.py @@ -5,6 +5,7 @@ defaultdict, namedtuple, ) +from collections.abc import Iterator from dataclasses import make_dataclass from datetime import ( date, @@ -14,7 +15,6 @@ import functools import random import re -from typing import Iterator import warnings import numpy as np diff --git a/pandas/tests/io/json/test_readlines.py b/pandas/tests/io/json/test_readlines.py index 54f4980b1e4e3..c2f915e33df8a 100644 --- a/pandas/tests/io/json/test_readlines.py +++ b/pandas/tests/io/json/test_readlines.py @@ -1,6 +1,6 @@ +from collections.abc import Iterator from io import StringIO from pathlib import Path -from typing import Iterator import numpy as np import pytest diff --git a/pandas/tests/io/parser/test_python_parser_only.py b/pandas/tests/io/parser/test_python_parser_only.py index b22953fedd6af..959b988e208c1 100644 --- a/pandas/tests/io/parser/test_python_parser_only.py +++ b/pandas/tests/io/parser/test_python_parser_only.py @@ -12,7 +12,7 @@ StringIO, TextIOWrapper, ) -from typing import Iterator +from typing import TYPE_CHECKING import numpy as np import pytest @@ -29,6 +29,9 @@ ) import pandas._testing as tm +if TYPE_CHECKING: + from collections.abc import Iterator + def test_default_separator(python_parser_only): # see gh-17333 diff --git a/pandas/tests/io/pytables/common.py b/pandas/tests/io/pytables/common.py index ef90d97a5a98c..62582b212eb38 100644 --- a/pandas/tests/io/pytables/common.py +++ b/pandas/tests/io/pytables/common.py @@ -1,7 +1,7 @@ +from collections.abc import Generator from contextlib import contextmanager import pathlib import tempfile -from typing import Generator import pytest diff --git a/pandas/tests/io/test_html.py b/pandas/tests/io/test_html.py index 488ffd77739f3..e884d9bea26fe 100644 --- a/pandas/tests/io/test_html.py +++ b/pandas/tests/io/test_html.py @@ -1,3 +1,4 @@ +from collections.abc import Iterator from functools import partial from io import ( BytesIO, @@ -7,7 +8,6 @@ from pathlib import Path import re import threading -from typing import Iterator from urllib.error import URLError import numpy as np diff --git a/pandas/tests/libs/test_hashtable.py b/pandas/tests/libs/test_hashtable.py index ab4dd58e18ce8..41ea557924b25 100644 --- a/pandas/tests/libs/test_hashtable.py +++ b/pandas/tests/libs/test_hashtable.py @@ -1,8 +1,8 @@ +from collections.abc import Generator from contextlib import contextmanager import re import struct import tracemalloc -from typing import Generator import numpy as np import pytest diff --git a/pandas/tests/plotting/common.py b/pandas/tests/plotting/common.py index 9dce817c23169..e51dd06881c4f 100644 --- a/pandas/tests/plotting/common.py +++ b/pandas/tests/plotting/common.py @@ -4,10 +4,7 @@ from __future__ import annotations -from typing import ( - TYPE_CHECKING, - Sequence, -) +from typing import TYPE_CHECKING import numpy as np @@ -18,6 +15,8 @@ import pandas._testing as tm if TYPE_CHECKING: + from collections.abc import Sequence + from matplotlib.axes import Axes diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index 3c6f75bdcfc46..86a3017753844 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -1,7 +1,6 @@ from datetime import datetime from functools import partial from io import StringIO -from typing import List import numpy as np import pytest @@ -1335,7 +1334,7 @@ def test_resample_consistency(unit): tm.assert_series_equal(s10_2, rl) -dates1: List[DatetimeNaTType] = [ +dates1: list[DatetimeNaTType] = [ datetime(2014, 10, 1), datetime(2014, 9, 3), datetime(2014, 11, 5), @@ -1344,7 +1343,7 @@ def test_resample_consistency(unit): datetime(2014, 7, 15), ] -dates2: List[DatetimeNaTType] = ( +dates2: list[DatetimeNaTType] = ( dates1[:2] + [pd.NaT] + dates1[2:4] + [pd.NaT] + dates1[4:] ) dates3 = [pd.NaT] + dates1 + [pd.NaT] diff --git a/pandas/tests/reshape/concat/test_concat.py b/pandas/tests/reshape/concat/test_concat.py index dc14e6e74302e..6ab1407b9ff82 100644 --- a/pandas/tests/reshape/concat/test_concat.py +++ b/pandas/tests/reshape/concat/test_concat.py @@ -2,9 +2,9 @@ abc, deque, ) +from collections.abc import Iterator from datetime import datetime from decimal import Decimal -from typing import Iterator from warnings import ( catch_warnings, simplefilter, diff --git a/pandas/tests/series/test_constructors.py b/pandas/tests/series/test_constructors.py index ceb283ca9e9e7..c7536273862c0 100644 --- a/pandas/tests/series/test_constructors.py +++ b/pandas/tests/series/test_constructors.py @@ -1,9 +1,9 @@ from collections import OrderedDict +from collections.abc import Iterator from datetime import ( datetime, timedelta, ) -from typing import Iterator from dateutil.tz import tzoffset import numpy as np diff --git a/pandas/tests/test_register_accessor.py b/pandas/tests/test_register_accessor.py index a76e4b09b7f4d..5b200711f4b36 100644 --- a/pandas/tests/test_register_accessor.py +++ b/pandas/tests/test_register_accessor.py @@ -1,5 +1,5 @@ +from collections.abc import Generator import contextlib -from typing import Generator import pytest diff --git a/pandas/tests/util/test_str_methods.py b/pandas/tests/util/test_str_methods.py deleted file mode 100644 index c07730f589824..0000000000000 --- a/pandas/tests/util/test_str_methods.py +++ /dev/null @@ -1,47 +0,0 @@ -import sys - -import pytest - -if sys.version_info < (3, 9): - from pandas.util._str_methods import ( - removeprefix, - removesuffix, - ) - - @pytest.mark.parametrize( - "string, prefix, expected", - ( - ("wildcat", "wild", "cat"), - ("blackbird", "black", "bird"), - ("housefly", "house", "fly"), - ("ladybug", "lady", "bug"), - ("rattlesnake", "rattle", "snake"), - ("baboon", "badger", "baboon"), - ("quetzal", "elk", "quetzal"), - ), - ) - def test_remove_prefix(string, prefix, expected): - result = removeprefix(string, prefix) - assert result == expected - - @pytest.mark.parametrize( - "string, suffix, expected", - ( - ("wildcat", "cat", "wild"), - ("blackbird", "bird", "black"), - ("housefly", "fly", "house"), - ("ladybug", "bug", "lady"), - ("rattlesnake", "snake", "rattle"), - ("seahorse", "horse", "sea"), - ("baboon", "badger", "baboon"), - ("quetzal", "elk", "quetzal"), - ), - ) - def test_remove_suffix(string, suffix, expected): - result = removesuffix(string, suffix) - assert result == expected - -else: - # NOTE: remove this file when pyupgrade --py39-plus removes - # the above block - pass diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index cba7010a5bc39..4c2122c3fdff1 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -4,9 +4,9 @@ import inspect from textwrap import dedent from typing import ( + TYPE_CHECKING, Any, Callable, - Mapping, cast, ) import warnings @@ -18,6 +18,9 @@ ) from pandas.util._exceptions import find_stack_level +if TYPE_CHECKING: + from collections.abc import Mapping + def deprecate( name: str, diff --git a/pandas/util/_doctools.py b/pandas/util/_doctools.py index 9e3ab80d1d40a..12619abf4baaf 100644 --- a/pandas/util/_doctools.py +++ b/pandas/util/_doctools.py @@ -1,11 +1,14 @@ from __future__ import annotations -from typing import Iterable +from typing import TYPE_CHECKING import numpy as np import pandas as pd +if TYPE_CHECKING: + from collections.abc import Iterable + class TablePlotter: """ diff --git a/pandas/util/_exceptions.py b/pandas/util/_exceptions.py index 1eefd06a133fb..573f76a63459b 100644 --- a/pandas/util/_exceptions.py +++ b/pandas/util/_exceptions.py @@ -4,9 +4,12 @@ import inspect import os import re -from typing import Generator +from typing import TYPE_CHECKING import warnings +if TYPE_CHECKING: + from collections.abc import Generator + @contextlib.contextmanager def rewrite_exception(old_name: str, new_name: str) -> Generator[None, None, None]: diff --git a/pandas/util/_str_methods.py b/pandas/util/_str_methods.py deleted file mode 100644 index 8f7aef80bc108..0000000000000 --- a/pandas/util/_str_methods.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Python3.9 introduces removesuffix and remove prefix. - -They're reimplemented here for use in Python3.8. - -NOTE: when pyupgrade --py39-plus removes nearly everything in this file, -this file and the associated tests should be removed. -""" -from __future__ import annotations - -import sys - -if sys.version_info < (3, 9): - - def removesuffix(string: str, suffix: str) -> str: - if string.endswith(suffix): - return string[: -len(suffix)] - return string - - def removeprefix(string: str, prefix: str) -> str: - if string.startswith(prefix): - return string[len(prefix) :] - return string - -else: - # NOTE: remove this file when pyupgrade --py39-plus removes - # the above block - pass diff --git a/pandas/util/_validators.py b/pandas/util/_validators.py index 517b88b0cd938..310d08e84433c 100644 --- a/pandas/util/_validators.py +++ b/pandas/util/_validators.py @@ -4,9 +4,11 @@ """ from __future__ import annotations -from typing import ( +from collections.abc import ( Iterable, Sequence, +) +from typing import ( TypeVar, overload, ) diff --git a/pandas/util/version/__init__.py b/pandas/util/version/__init__.py index 5d4937451c49c..c72598eb50410 100644 --- a/pandas/util/version/__init__.py +++ b/pandas/util/version/__init__.py @@ -9,11 +9,11 @@ from __future__ import annotations import collections +from collections.abc import Iterator import itertools import re from typing import ( Callable, - Iterator, SupportsInt, Tuple, Union, @@ -88,23 +88,23 @@ def __neg__(self: object) -> InfinityType: InfiniteTypes = Union[InfinityType, NegativeInfinityType] -PrePostDevType = Union[InfiniteTypes, Tuple[str, int]] +PrePostDevType = Union[InfiniteTypes, tuple[str, int]] SubLocalType = Union[InfiniteTypes, int, str] LocalType = Union[ NegativeInfinityType, - Tuple[ + tuple[ Union[ SubLocalType, - Tuple[SubLocalType, str], - Tuple[NegativeInfinityType, SubLocalType], + tuple[SubLocalType, str], + tuple[NegativeInfinityType, SubLocalType], ], ..., ], ] -CmpKey = Tuple[ - int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType +CmpKey = tuple[ + int, tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType ] -LegacyCmpKey = Tuple[int, Tuple[str, ...]] +LegacyCmpKey = tuple[int, tuple[str, ...]] VersionComparisonMethod = Callable[ [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool ] diff --git a/scripts/check_for_inconsistent_pandas_namespace.py b/scripts/check_for_inconsistent_pandas_namespace.py index 3c21821e794a9..52eca6f6d93ac 100644 --- a/scripts/check_for_inconsistent_pandas_namespace.py +++ b/scripts/check_for_inconsistent_pandas_namespace.py @@ -22,13 +22,14 @@ import argparse import ast +from collections.abc import ( + MutableMapping, + Sequence, +) import sys from typing import ( - MutableMapping, NamedTuple, Optional, - Sequence, - Set, ) ERROR_MESSAGE = ( @@ -46,7 +47,7 @@ class OffsetWithNamespace(NamedTuple): class Visitor(ast.NodeVisitor): def __init__(self) -> None: self.pandas_namespace: MutableMapping[OffsetWithNamespace, str] = {} - self.imported_from_pandas: Set[str] = set() + self.imported_from_pandas: set[str] = set() def visit_Attribute(self, node: ast.Attribute) -> None: if isinstance(node.value, ast.Name) and node.value.id in {"pandas", "pd"}: diff --git a/scripts/check_test_naming.py b/scripts/check_test_naming.py index 158cf46f264c2..f9190643b3246 100644 --- a/scripts/check_test_naming.py +++ b/scripts/check_test_naming.py @@ -15,10 +15,13 @@ class or function definition. Though hopefully that shouldn't be necessary. import os from pathlib import Path import sys -from typing import ( - Iterator, - Sequence, -) +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import ( + Iterator, + Sequence, + ) PRAGMA = "# not a test" diff --git a/scripts/no_bool_in_generic.py b/scripts/no_bool_in_generic.py index 1427974249702..e57ac30f7084b 100644 --- a/scripts/no_bool_in_generic.py +++ b/scripts/no_bool_in_generic.py @@ -15,7 +15,10 @@ import argparse import ast import collections -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence def visit(tree: ast.Module) -> dict[int, list[int]]: diff --git a/scripts/pandas_errors_documented.py b/scripts/pandas_errors_documented.py index 116a63b33eaf0..b68da137717de 100644 --- a/scripts/pandas_errors_documented.py +++ b/scripts/pandas_errors_documented.py @@ -12,7 +12,10 @@ import ast import pathlib import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence API_PATH = pathlib.Path("doc/source/reference/testing.rst").resolve() diff --git a/scripts/run_autotyping.py b/scripts/run_autotyping.py index 4c0a3a9cf985f..8729085f0dd4b 100644 --- a/scripts/run_autotyping.py +++ b/scripts/run_autotyping.py @@ -9,7 +9,10 @@ import argparse import subprocess import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence def main(argv: Sequence[str] | None = None) -> None: diff --git a/scripts/sort_whatsnew_note.py b/scripts/sort_whatsnew_note.py index 531ea57244b23..428ffca83ea26 100644 --- a/scripts/sort_whatsnew_note.py +++ b/scripts/sort_whatsnew_note.py @@ -28,7 +28,11 @@ import argparse import re import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence + # Check line starts with `-` and ends with e.g. `(:issue:`12345`)`, # possibly with a trailing full stop. diff --git a/scripts/use_io_common_urlopen.py b/scripts/use_io_common_urlopen.py index 11d8378fce574..ade97f53cd827 100644 --- a/scripts/use_io_common_urlopen.py +++ b/scripts/use_io_common_urlopen.py @@ -14,7 +14,11 @@ import argparse import ast import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence + ERROR_MESSAGE = ( "{path}:{lineno}:{col_offset}: " diff --git a/scripts/use_pd_array_in_core.py b/scripts/use_pd_array_in_core.py index 61ba070e52f1b..c9e14dece44e4 100644 --- a/scripts/use_pd_array_in_core.py +++ b/scripts/use_pd_array_in_core.py @@ -14,7 +14,11 @@ import argparse import ast import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence + ERROR_MESSAGE = ( "{path}:{lineno}:{col_offset}: " diff --git a/scripts/validate_exception_location.py b/scripts/validate_exception_location.py index 5f77e4c78db82..fb0dc47252717 100644 --- a/scripts/validate_exception_location.py +++ b/scripts/validate_exception_location.py @@ -24,7 +24,10 @@ import ast import pathlib import sys -from typing import Sequence +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Sequence API_PATH = pathlib.Path("doc/source/reference/testing.rst").resolve() ERROR_MESSAGE = ( diff --git a/scripts/validate_rst_title_capitalization.py b/scripts/validate_rst_title_capitalization.py index 0f4c11eb30b07..44318cd797163 100755 --- a/scripts/validate_rst_title_capitalization.py +++ b/scripts/validate_rst_title_capitalization.py @@ -16,7 +16,11 @@ import argparse import re import sys -from typing import Iterable +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Iterable + CAPITALIZATION_EXCEPTIONS = { "pandas", diff --git a/scripts/validate_unwanted_patterns.py b/scripts/validate_unwanted_patterns.py index 466419bf5093e..8fed7513f5d4e 100755 --- a/scripts/validate_unwanted_patterns.py +++ b/scripts/validate_unwanted_patterns.py @@ -12,19 +12,16 @@ import argparse import ast +from collections.abc import Iterable import sys import token import tokenize from typing import ( IO, Callable, - Iterable, - List, - Set, - Tuple, ) -PRIVATE_IMPORTS_TO_IGNORE: Set[str] = { +PRIVATE_IMPORTS_TO_IGNORE: set[str] = { "_extension_array_shared_docs", "_index_shared_docs", "_interval_shared_docs", @@ -88,7 +85,7 @@ def _get_literal_string_prefix_len(token_string: str) -> int: return 0 -def bare_pytest_raises(file_obj: IO[str]) -> Iterable[Tuple[int, str]]: +def bare_pytest_raises(file_obj: IO[str]) -> Iterable[tuple[int, str]]: """ Test Case for bare pytest raises. @@ -150,7 +147,7 @@ def bare_pytest_raises(file_obj: IO[str]) -> Iterable[Tuple[int, str]]: PRIVATE_FUNCTIONS_ALLOWED = {"sys._getframe"} # no known alternative -def private_function_across_module(file_obj: IO[str]) -> Iterable[Tuple[int, str]]: +def private_function_across_module(file_obj: IO[str]) -> Iterable[tuple[int, str]]: """ Checking that a private function is not used across modules. Parameters @@ -167,7 +164,7 @@ def private_function_across_module(file_obj: IO[str]) -> Iterable[Tuple[int, str contents = file_obj.read() tree = ast.parse(contents) - imported_modules: Set[str] = set() + imported_modules: set[str] = set() for node in ast.walk(tree): if isinstance(node, (ast.Import, ast.ImportFrom)): @@ -199,7 +196,7 @@ def private_function_across_module(file_obj: IO[str]) -> Iterable[Tuple[int, str yield (node.lineno, f"Private function '{module_name}.{function_name}'") -def private_import_across_module(file_obj: IO[str]) -> Iterable[Tuple[int, str]]: +def private_import_across_module(file_obj: IO[str]) -> Iterable[tuple[int, str]]: """ Checking that a private function is not imported across modules. Parameters @@ -231,7 +228,7 @@ def private_import_across_module(file_obj: IO[str]) -> Iterable[Tuple[int, str]] def strings_with_wrong_placed_whitespace( file_obj: IO[str], -) -> Iterable[Tuple[int, str]]: +) -> Iterable[tuple[int, str]]: """ Test case for leading spaces in concated strings. @@ -328,7 +325,7 @@ def has_wrong_whitespace(first_line: str, second_line: str) -> bool: return True return False - tokens: List = list(tokenize.generate_tokens(file_obj.readline)) + tokens: list = list(tokenize.generate_tokens(file_obj.readline)) for first_token, second_token, third_token in zip(tokens, tokens[1:], tokens[2:]): # Checking if we are in a block of concated string @@ -354,7 +351,7 @@ def has_wrong_whitespace(first_line: str, second_line: str) -> bool: ) -def nodefault_used_not_only_for_typing(file_obj: IO[str]) -> Iterable[Tuple[int, str]]: +def nodefault_used_not_only_for_typing(file_obj: IO[str]) -> Iterable[tuple[int, str]]: """Test case where pandas._libs.lib.NoDefault is not used for typing. Parameters @@ -372,7 +369,7 @@ def nodefault_used_not_only_for_typing(file_obj: IO[str]) -> Iterable[Tuple[int, contents = file_obj.read() tree = ast.parse(contents) in_annotation = False - nodes: List[tuple[bool, ast.AST]] = [(in_annotation, tree)] + nodes: list[tuple[bool, ast.AST]] = [(in_annotation, tree)] while nodes: in_annotation, node = nodes.pop() @@ -401,7 +398,7 @@ def nodefault_used_not_only_for_typing(file_obj: IO[str]) -> Iterable[Tuple[int, def main( - function: Callable[[IO[str]], Iterable[Tuple[int, str]]], + function: Callable[[IO[str]], Iterable[tuple[int, str]]], source_path: str, output_format: str, ) -> bool: @@ -447,7 +444,7 @@ def main( if __name__ == "__main__": - available_validation_types: List[str] = [ + available_validation_types: list[str] = [ "bare_pytest_raises", "private_function_across_module", "private_import_across_module",