From 9d209ce252d95f5c4b7f517755cc3f06e7cf4784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Thu, 4 Aug 2022 12:40:16 -0400 Subject: [PATCH] TYP: move imports inside TYPE_CHECKING --- pandas/core/arrays/period.py | 3 ++- pandas/core/computation/engines.py | 5 ++++- pandas/core/computation/eval.py | 5 ++++- pandas/core/computation/pytables.py | 9 +++++++-- pandas/core/groupby/categorical.py | 6 +++++- pandas/core/groupby/generic.py | 5 ++++- pandas/core/groupby/ops.py | 5 ++++- pandas/core/indexes/extension.py | 7 +++++-- pandas/core/interchange/dataframe.py | 2 +- pandas/core/internals/blocks.py | 2 +- pandas/core/resample.py | 2 +- pandas/core/reshape/merge.py | 2 +- pandas/core/reshape/reshape.py | 2 +- pandas/io/excel/_odswriter.py | 5 ++++- pandas/io/formats/info.py | 5 ++--- pandas/io/formats/latex.py | 4 +++- pandas/io/formats/string.py | 9 +++++++-- pandas/io/formats/xml.py | 9 +++++++-- pandas/io/html.py | 5 ++++- pandas/io/json/_json.py | 5 ++++- pandas/io/parsers/arrow_parser_wrapper.py | 7 +++++-- pandas/io/parsers/base_parser.py | 5 ++++- pandas/io/parsers/c_parser_wrapper.py | 11 +++++++---- pandas/io/parsers/python_parser.py | 12 +++++++----- pandas/io/spss.py | 10 +++++++--- pandas/io/xml.py | 3 ++- pandas/plotting/_matplotlib/converter.py | 5 ++++- pandas/plotting/_matplotlib/hist.py | 4 ++-- 28 files changed, 109 insertions(+), 45 deletions(-) diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 12352c4490f29..cd88eb1e49be8 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -77,7 +77,6 @@ import pandas.core.algorithms as algos from pandas.core.arrays import datetimelike as dtl -from pandas.core.arrays.base import ExtensionArray import pandas.core.common as com if TYPE_CHECKING: @@ -91,6 +90,8 @@ DatetimeArray, TimedeltaArray, ) + from pandas.core.arrays.base import ExtensionArray + BaseOffsetT = TypeVar("BaseOffsetT", bound=BaseOffset) diff --git a/pandas/core/computation/engines.py b/pandas/core/computation/engines.py index c293839776e26..2ea5a5367611f 100644 --- a/pandas/core/computation/engines.py +++ b/pandas/core/computation/engines.py @@ -4,6 +4,7 @@ from __future__ import annotations import abc +from typing import TYPE_CHECKING from pandas.errors import NumExprClobberingError @@ -11,7 +12,6 @@ align_terms, reconstruct_object, ) -from pandas.core.computation.expr import Expr from pandas.core.computation.ops import ( MATHOPS, REDUCTIONS, @@ -19,6 +19,9 @@ import pandas.io.formats.printing as printing +if TYPE_CHECKING: + from pandas.core.computation.expr import Expr + _ne_builtins = frozenset(MATHOPS + REDUCTIONS) diff --git a/pandas/core/computation/eval.py b/pandas/core/computation/eval.py index 1892069f78edd..ea70d0130a119 100644 --- a/pandas/core/computation/eval.py +++ b/pandas/core/computation/eval.py @@ -4,6 +4,7 @@ from __future__ import annotations import tokenize +from typing import TYPE_CHECKING import warnings from pandas._libs.lib import no_default @@ -15,12 +16,14 @@ PARSERS, Expr, ) -from pandas.core.computation.ops import BinOp from pandas.core.computation.parsing import tokenize_string from pandas.core.computation.scope import ensure_scope from pandas.io.formats.printing import pprint_thing +if TYPE_CHECKING: + from pandas.core.computation.ops import BinOp + def _check_engine(engine: str | None) -> str: """ diff --git a/pandas/core/computation/pytables.py b/pandas/core/computation/pytables.py index 29af322ba0b42..5fbc26c057862 100644 --- a/pandas/core/computation/pytables.py +++ b/pandas/core/computation/pytables.py @@ -3,7 +3,10 @@ import ast from functools import partial -from typing import Any +from typing import ( + TYPE_CHECKING, + Any, +) import numpy as np @@ -12,7 +15,6 @@ Timestamp, ) from pandas._typing import npt -from pandas.compat.chainmap import DeepChainMap from pandas.errors import UndefinedVariableError from pandas.core.dtypes.common import is_list_like @@ -34,6 +36,9 @@ pprint_thing_encoded, ) +if TYPE_CHECKING: + from pandas.compat.chainmap import DeepChainMap + class PyTablesScope(_scope.Scope): __slots__ = ("queryables",) diff --git a/pandas/core/groupby/categorical.py b/pandas/core/groupby/categorical.py index 2a2671374efc4..a9ad2401564ec 100644 --- a/pandas/core/groupby/categorical.py +++ b/pandas/core/groupby/categorical.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import numpy as np from pandas.core.algorithms import unique1d @@ -8,7 +10,9 @@ CategoricalDtype, recode_for_categories, ) -from pandas.core.indexes.api import CategoricalIndex + +if TYPE_CHECKING: + from pandas.core.indexes.api import CategoricalIndex def recode_for_groupby( diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 631f70f390319..b5b585fb78950 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -11,6 +11,7 @@ from functools import partial from textwrap import dedent from typing import ( + TYPE_CHECKING, Any, Callable, Hashable, @@ -72,7 +73,6 @@ import pandas.core.common as com from pandas.core.construction import create_series_with_explicit_dtype from pandas.core.frame import DataFrame -from pandas.core.generic import NDFrame from pandas.core.groupby import base from pandas.core.groupby.groupby import ( GroupBy, @@ -93,6 +93,9 @@ from pandas.plotting import boxplot_frame_groupby +if TYPE_CHECKING: + from pandas.core.generic import NDFrame + # TODO(typing) the return value on this callable should be any *scalar*. AggScalar = Union[str, Callable[..., Any]] # TODO: validate types on ScalarResult and move to _typing diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index 283e4a48657c5..d6b63956422c7 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -10,6 +10,7 @@ import collections import functools from typing import ( + TYPE_CHECKING, Callable, Generic, Hashable, @@ -77,7 +78,6 @@ ) from pandas.core.arrays.string_ import StringDtype from pandas.core.frame import DataFrame -from pandas.core.generic import NDFrame from pandas.core.groupby import grouper from pandas.core.indexes.api import ( CategoricalIndex, @@ -95,6 +95,9 @@ get_indexer_dict, ) +if TYPE_CHECKING: + from pandas.core.generic import NDFrame + class WrappedCythonOp: """ diff --git a/pandas/core/indexes/extension.py b/pandas/core/indexes/extension.py index 28a0b43d5b02b..5bf30dde33ba4 100644 --- a/pandas/core/indexes/extension.py +++ b/pandas/core/indexes/extension.py @@ -4,6 +4,7 @@ from __future__ import annotations from typing import ( + TYPE_CHECKING, Callable, TypeVar, ) @@ -21,10 +22,12 @@ from pandas.core.dtypes.generic import ABCDataFrame -from pandas.core.arrays import IntervalArray -from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.indexes.base import Index +if TYPE_CHECKING: + from pandas.core.arrays import IntervalArray + from pandas.core.arrays._mixins import NDArrayBackedExtensionArray + _T = TypeVar("_T", bound="NDArrayBackedExtensionIndex") _ExtensionIndexT = TypeVar("_ExtensionIndexT", bound="ExtensionIndex") diff --git a/pandas/core/interchange/dataframe.py b/pandas/core/interchange/dataframe.py index ddcffbff64670..9139cb41e3af7 100644 --- a/pandas/core/interchange/dataframe.py +++ b/pandas/core/interchange/dataframe.py @@ -3,11 +3,11 @@ from collections import abc from typing import TYPE_CHECKING -import pandas as pd from pandas.core.interchange.column import PandasColumn from pandas.core.interchange.dataframe_protocol import DataFrame as DataFrameXchg if TYPE_CHECKING: + import pandas as pd from pandas import Index diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index df327716970f1..a70f9b7b20d5a 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -98,7 +98,6 @@ PeriodArray, TimedeltaArray, ) -from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.arrays.sparse import SparseDtype from pandas.core.base import PandasObject import pandas.core.common as com @@ -115,6 +114,7 @@ Float64Index, Index, ) + from pandas.core.arrays._mixins import NDArrayBackedExtensionArray # comparison is faster than is_object_dtype _dtype_obj = np.dtype("object") diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 8797324166745..54b6b32ff1a68 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -68,7 +68,6 @@ ) from pandas.core.groupby.grouper import Grouper from pandas.core.groupby.ops import BinGrouper -from pandas.core.indexes.api import Index from pandas.core.indexes.datetimes import ( DatetimeIndex, date_range, @@ -96,6 +95,7 @@ if TYPE_CHECKING: from pandas import ( DataFrame, + Index, Series, ) diff --git a/pandas/core/reshape/merge.py b/pandas/core/reshape/merge.py index e06a288c1eb38..77a0d34132da0 100644 --- a/pandas/core/reshape/merge.py +++ b/pandas/core/reshape/merge.py @@ -73,7 +73,6 @@ MultiIndex, Series, ) -from pandas.core import groupby import pandas.core.algorithms as algos from pandas.core.arrays import ExtensionArray from pandas.core.arrays._mixins import NDArrayBackedExtensionArray @@ -85,6 +84,7 @@ if TYPE_CHECKING: from pandas import DataFrame + from pandas.core import groupby from pandas.core.arrays import DatetimeArray diff --git a/pandas/core/reshape/reshape.py b/pandas/core/reshape/reshape.py index d4f4057af7bfd..5039a29b74f1b 100644 --- a/pandas/core/reshape/reshape.py +++ b/pandas/core/reshape/reshape.py @@ -30,7 +30,6 @@ Index, MultiIndex, ) -from pandas.core.indexes.frozen import FrozenList from pandas.core.series import Series from pandas.core.sorting import ( compress_group_index, @@ -42,6 +41,7 @@ if TYPE_CHECKING: from pandas.core.arrays import ExtensionArray + from pandas.core.indexes.frozen import FrozenList class _Unstacker: diff --git a/pandas/io/excel/_odswriter.py b/pandas/io/excel/_odswriter.py index a6e125f4b9f33..185e93591cfe0 100644 --- a/pandas/io/excel/_odswriter.py +++ b/pandas/io/excel/_odswriter.py @@ -3,6 +3,7 @@ from collections import defaultdict import datetime from typing import ( + TYPE_CHECKING, Any, DefaultDict, Tuple, @@ -21,7 +22,9 @@ combine_kwargs, validate_freeze_panes, ) -from pandas.io.formats.excel import ExcelCell + +if TYPE_CHECKING: + from pandas.io.formats.excel import ExcelCell class ODSWriter(ExcelWriter): diff --git a/pandas/io/formats/info.py b/pandas/io/formats/info.py index 543df8bec657b..e0f6e01a65052 100644 --- a/pandas/io/formats/info.py +++ b/pandas/io/formats/info.py @@ -21,14 +21,13 @@ WriteBuffer, ) -from pandas.core.indexes.api import Index - from pandas.io.formats import format as fmt from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: - from pandas.core.frame import ( + from pandas import ( DataFrame, + Index, Series, ) diff --git a/pandas/io/formats/latex.py b/pandas/io/formats/latex.py index 0fb6971018fd0..6bf4412be95d4 100644 --- a/pandas/io/formats/latex.py +++ b/pandas/io/formats/latex.py @@ -8,6 +8,7 @@ abstractmethod, ) from typing import ( + TYPE_CHECKING, Iterator, Sequence, ) @@ -16,7 +17,8 @@ from pandas.core.dtypes.generic import ABCMultiIndex -from pandas.io.formats.format import DataFrameFormatter +if TYPE_CHECKING: + from pandas.io.formats.format import DataFrameFormatter def _split_into_full_short_caption( diff --git a/pandas/io/formats/string.py b/pandas/io/formats/string.py index 835e15789d615..071afc059b166 100644 --- a/pandas/io/formats/string.py +++ b/pandas/io/formats/string.py @@ -4,13 +4,18 @@ from __future__ import annotations from shutil import get_terminal_size -from typing import Iterable +from typing import ( + TYPE_CHECKING, + Iterable, +) import numpy as np -from pandas.io.formats.format import DataFrameFormatter from pandas.io.formats.printing import pprint_thing +if TYPE_CHECKING: + from pandas.io.formats.format import DataFrameFormatter + class StringFormatter: """Formatter for string representation of a dataframe.""" diff --git a/pandas/io/formats/xml.py b/pandas/io/formats/xml.py index 4e8573b74ccdd..eb1835f0392b0 100644 --- a/pandas/io/formats/xml.py +++ b/pandas/io/formats/xml.py @@ -5,7 +5,10 @@ import codecs import io -from typing import Any +from typing import ( + TYPE_CHECKING, + Any, +) from pandas._typing import ( CompressionOptions, @@ -20,7 +23,6 @@ from pandas.core.dtypes.common import is_list_like from pandas.core.dtypes.missing import isna -from pandas.core.frame import DataFrame from pandas.core.shared_docs import _shared_docs from pandas.io.common import get_handle @@ -29,6 +31,9 @@ preprocess_data, ) +if TYPE_CHECKING: + from pandas import DataFrame + @doc( storage_options=_shared_docs["storage_options"], diff --git a/pandas/io/html.py b/pandas/io/html.py index ad92883fe8572..dbbe61dcb8247 100644 --- a/pandas/io/html.py +++ b/pandas/io/html.py @@ -10,6 +10,7 @@ import numbers import re from typing import ( + TYPE_CHECKING, Iterable, Pattern, Sequence, @@ -30,7 +31,6 @@ from pandas.core.dtypes.common import is_list_like from pandas.core.construction import create_series_with_explicit_dtype -from pandas.core.frame import DataFrame from pandas.io.common import ( file_exists, @@ -43,6 +43,9 @@ from pandas.io.formats.printing import pprint_thing from pandas.io.parsers import TextParser +if TYPE_CHECKING: + from pandas import DataFrame + _IMPORTS = False _HAS_BS4 = False _HAS_LXML = False diff --git a/pandas/io/json/_json.py b/pandas/io/json/_json.py index d40b0357049a1..02a0b27f82ef8 100644 --- a/pandas/io/json/_json.py +++ b/pandas/io/json/_json.py @@ -9,6 +9,7 @@ from io import StringIO from itertools import islice from typing import ( + TYPE_CHECKING, Any, Callable, Generic, @@ -53,7 +54,6 @@ to_datetime, ) from pandas.core.construction import create_series_with_explicit_dtype -from pandas.core.generic import NDFrame from pandas.core.reshape.concat import concat from pandas.core.shared_docs import _shared_docs @@ -73,6 +73,9 @@ ) from pandas.io.parsers.readers import validate_integer +if TYPE_CHECKING: + from pandas.core.generic import NDFrame + FrameSeriesStrT = TypeVar("FrameSeriesStrT", bound=Literal["frame", "series"]) loads = json.loads diff --git a/pandas/io/parsers/arrow_parser_wrapper.py b/pandas/io/parsers/arrow_parser_wrapper.py index 21e8bb5f9e89f..2305c209936b6 100644 --- a/pandas/io/parsers/arrow_parser_wrapper.py +++ b/pandas/io/parsers/arrow_parser_wrapper.py @@ -1,14 +1,17 @@ from __future__ import annotations +from typing import TYPE_CHECKING + from pandas._typing import ReadBuffer from pandas.compat._optional import import_optional_dependency from pandas.core.dtypes.inference import is_integer -from pandas.core.frame import DataFrame - from pandas.io.parsers.base_parser import ParserBase +if TYPE_CHECKING: + from pandas import DataFrame + class ArrowParserWrapper(ParserBase): """ diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 531fa5400f466..0e40e47bf7cb1 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -7,6 +7,7 @@ from enum import Enum import itertools from typing import ( + TYPE_CHECKING, Any, Callable, DefaultDict, @@ -59,7 +60,6 @@ from pandas.core.dtypes.dtypes import CategoricalDtype from pandas.core.dtypes.missing import isna -from pandas import DataFrame from pandas.core import algorithms from pandas.core.arrays import Categorical from pandas.core.indexes.api import ( @@ -72,6 +72,9 @@ from pandas.io.date_converters import generic_parser +if TYPE_CHECKING: + from pandas import DataFrame + class ParserBase: class BadLineHandleMethod(Enum): diff --git a/pandas/io/parsers/c_parser_wrapper.py b/pandas/io/parsers/c_parser_wrapper.py index 711d0857a5a1c..aec999e40b0f5 100644 --- a/pandas/io/parsers/c_parser_wrapper.py +++ b/pandas/io/parsers/c_parser_wrapper.py @@ -3,6 +3,7 @@ from collections import defaultdict from io import TextIOWrapper from typing import ( + TYPE_CHECKING, Hashable, Mapping, Sequence, @@ -28,10 +29,6 @@ from pandas.core.dtypes.concat import union_categoricals from pandas.core.dtypes.dtypes import ExtensionDtype -from pandas import ( - Index, - MultiIndex, -) from pandas.core.indexes.api import ensure_index_from_sequences from pandas.io.parsers.base_parser import ( @@ -39,6 +36,12 @@ is_index_col, ) +if TYPE_CHECKING: + from pandas import ( + Index, + MultiIndex, + ) + class CParserWrapper(ParserBase): low_memory: bool diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index 3e897f9b1334e..7c03a81dbc0e6 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -10,6 +10,7 @@ import sys from typing import ( IO, + TYPE_CHECKING, DefaultDict, Hashable, Iterator, @@ -38,16 +39,17 @@ from pandas.core.dtypes.common import is_integer from pandas.core.dtypes.inference import is_dict_like -from pandas import ( - Index, - MultiIndex, -) - from pandas.io.parsers.base_parser import ( ParserBase, parser_defaults, ) +if TYPE_CHECKING: + from pandas import ( + Index, + MultiIndex, + ) + # BOM character (byte order mark) # This exists at the beginning of a file to indicate endianness # of a file (stream). Unfortunately, this marker screws up parsing, diff --git a/pandas/io/spss.py b/pandas/io/spss.py index 533cf7a7a6331..1b83d339a2990 100644 --- a/pandas/io/spss.py +++ b/pandas/io/spss.py @@ -1,16 +1,20 @@ from __future__ import annotations from pathlib import Path -from typing import Sequence +from typing import ( + TYPE_CHECKING, + Sequence, +) from pandas.compat._optional import import_optional_dependency from pandas.core.dtypes.inference import is_list_like -from pandas.core.api import DataFrame - from pandas.io.common import stringify_path +if TYPE_CHECKING: + from pandas import DataFrame + def read_spss( path: str | Path, diff --git a/pandas/io/xml.py b/pandas/io/xml.py index d52482fe2ef5a..fbe3e41be88a9 100644 --- a/pandas/io/xml.py +++ b/pandas/io/xml.py @@ -34,7 +34,6 @@ from pandas.core.dtypes.common import is_list_like -from pandas.core.frame import DataFrame from pandas.core.shared_docs import _shared_docs from pandas.io.common import ( @@ -55,6 +54,8 @@ _XSLTResultTree, ) + from pandas import DataFrame + @doc( storage_options=_shared_docs["storage_options"], diff --git a/pandas/plotting/_matplotlib/converter.py b/pandas/plotting/_matplotlib/converter.py index 8510a7acac117..51a081645373e 100644 --- a/pandas/plotting/_matplotlib/converter.py +++ b/pandas/plotting/_matplotlib/converter.py @@ -9,6 +9,7 @@ ) import functools from typing import ( + TYPE_CHECKING, Any, Final, Iterator, @@ -32,7 +33,6 @@ to_offset, ) from pandas._libs.tslibs.dtypes import FreqGroup -from pandas._libs.tslibs.offsets import BaseOffset from pandas._typing import F from pandas.core.dtypes.common import ( @@ -57,6 +57,9 @@ ) import pandas.core.tools.datetimes as tools +if TYPE_CHECKING: + from pandas._libs.tslibs.offsets import BaseOffset + # constants HOURS_PER_DAY: Final = 24.0 MIN_PER_HOUR: Final = 60.0 diff --git a/pandas/plotting/_matplotlib/hist.py b/pandas/plotting/_matplotlib/hist.py index 62242a4a2ddab..3ca00ae41d587 100644 --- a/pandas/plotting/_matplotlib/hist.py +++ b/pandas/plotting/_matplotlib/hist.py @@ -22,8 +22,6 @@ remove_na_arraylike, ) -from pandas.core.frame import DataFrame - from pandas.io.formats.printing import pprint_thing from pandas.plotting._matplotlib.core import ( LinePlot, @@ -44,6 +42,8 @@ if TYPE_CHECKING: from matplotlib.axes import Axes + from pandas import DataFrame + class HistPlot(LinePlot): @property