Skip to content

Commit 77b4824

Browse files
authored
TYP: misc Index return types (#57256)
* TYP: misc Index return types * add IndexT to ignore list
1 parent 9d50b3c commit 77b4824

File tree

10 files changed

+24
-14
lines changed

10 files changed

+24
-14
lines changed

pandas/_typing.py

+1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ def __reversed__(self) -> Iterator[_T_co]:
189189
# passed in, a DataFrame is always returned.
190190
NDFrameT = TypeVar("NDFrameT", bound="NDFrame")
191191

192+
IndexT = TypeVar("IndexT", bound="Index")
192193
NumpyIndexT = TypeVar("NumpyIndexT", np.ndarray, "Index")
193194

194195
AxisInt = int

pandas/core/generic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10740,7 +10740,7 @@ def _shift_with_freq(self, periods: int, axis: int, freq) -> Self:
1074010740
f"does not match PeriodIndex freq "
1074110741
f"{freq_to_period_freqstr(orig_freq.n, orig_freq.name)}"
1074210742
)
10743-
new_ax = index.shift(periods)
10743+
new_ax: Index = index.shift(periods)
1074410744
else:
1074510745
new_ax = index.shift(periods, freq)
1074610746

pandas/core/indexes/accessors.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from typing import (
77
TYPE_CHECKING,
8+
NoReturn,
89
cast,
910
)
1011
import warnings
@@ -108,7 +109,7 @@ def _delegate_property_get(self, name: str):
108109
# return the result as a Series
109110
return Series(result, index=index, name=self.name).__finalize__(self._parent)
110111

111-
def _delegate_property_set(self, name: str, value, *args, **kwargs):
112+
def _delegate_property_set(self, name: str, value, *args, **kwargs) -> NoReturn:
112113
raise ValueError(
113114
"modifications to a property of a datetimelike object are not supported. "
114115
"Change values on the original."
@@ -483,7 +484,7 @@ def to_pytimedelta(self) -> np.ndarray:
483484
return self._get_values().to_pytimedelta()
484485

485486
@property
486-
def components(self):
487+
def components(self) -> DataFrame:
487488
"""
488489
Return a Dataframe of the components of the Timedeltas.
489490

pandas/core/indexes/base.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
F,
5656
IgnoreRaise,
5757
IndexLabel,
58+
IndexT,
5859
JoinHow,
5960
Level,
6061
NaPosition,
@@ -2027,7 +2028,7 @@ def sortlevel(
20272028
ascending: bool | list[bool] = True,
20282029
sort_remaining=None,
20292030
na_position: NaPosition = "first",
2030-
):
2031+
) -> tuple[Self, np.ndarray]:
20312032
"""
20322033
For internal compatibility with the Index API.
20332034
@@ -4432,7 +4433,7 @@ def _wrap_reindex_result(self, target, indexer, preserve_names: bool):
44324433
target = self._maybe_preserve_names(target, preserve_names)
44334434
return target
44344435

4435-
def _maybe_preserve_names(self, target: Index, preserve_names: bool):
4436+
def _maybe_preserve_names(self, target: IndexT, preserve_names: bool) -> IndexT:
44364437
if preserve_names and target.nlevels == 1 and target.name != self.name:
44374438
target = target.copy(deep=False)
44384439
target.name = self.name
@@ -5987,7 +5988,7 @@ def sort(self, *args, **kwargs):
59875988
"""
59885989
raise TypeError("cannot sort an Index object in-place, use sort_values instead")
59895990

5990-
def shift(self, periods: int = 1, freq=None):
5991+
def shift(self, periods: int = 1, freq=None) -> Self:
59915992
"""
59925993
Shift index by desired number of time frequency increments.
59935994

pandas/core/indexes/datetimelike.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ def _can_partial_date_slice(self, reso: Resolution) -> bool:
273273
def _parsed_string_to_bounds(self, reso: Resolution, parsed):
274274
raise NotImplementedError
275275

276-
def _parse_with_reso(self, label: str):
276+
def _parse_with_reso(self, label: str) -> tuple[datetime, Resolution]:
277277
# overridden by TimedeltaIndex
278278
try:
279279
if self.freq is None or hasattr(self.freq, "rule_code"):
@@ -295,7 +295,7 @@ def _parse_with_reso(self, label: str):
295295
reso = Resolution.from_attrname(reso_str)
296296
return parsed, reso
297297

298-
def _get_string_slice(self, key: str):
298+
def _get_string_slice(self, key: str) -> slice | npt.NDArray[np.intp]:
299299
# overridden by TimedeltaIndex
300300
parsed, reso = self._parse_with_reso(key)
301301
try:

pandas/core/indexes/datetimes.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,9 @@ def snap(self, freq: Frequency = "S") -> DatetimeIndex:
518518
# --------------------------------------------------------------------
519519
# Indexing Methods
520520

521-
def _parsed_string_to_bounds(self, reso: Resolution, parsed: dt.datetime):
521+
def _parsed_string_to_bounds(
522+
self, reso: Resolution, parsed: dt.datetime
523+
) -> tuple[Timestamp, Timestamp]:
522524
"""
523525
Calculate datetime bounds for parsed time string and its resolution.
524526
@@ -555,7 +557,7 @@ def _parsed_string_to_bounds(self, reso: Resolution, parsed: dt.datetime):
555557
# which localizes parsed.
556558
return start, end
557559

558-
def _parse_with_reso(self, label: str):
560+
def _parse_with_reso(self, label: str) -> tuple[Timestamp, Resolution]:
559561
parsed, reso = super()._parse_with_reso(label)
560562

561563
parsed = Timestamp(parsed)

pandas/core/indexes/multi.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
F,
3838
IgnoreRaise,
3939
IndexLabel,
40+
IndexT,
4041
Scalar,
4142
Self,
4243
Shape,
@@ -2727,7 +2728,7 @@ def _wrap_reindex_result(self, target, indexer, preserve_names: bool):
27272728
target = self._maybe_preserve_names(target, preserve_names)
27282729
return target
27292730

2730-
def _maybe_preserve_names(self, target: Index, preserve_names: bool) -> Index:
2731+
def _maybe_preserve_names(self, target: IndexT, preserve_names: bool) -> IndexT:
27312732
if (
27322733
preserve_names
27332734
and target.nlevels == self.nlevels

pandas/core/indexes/range.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ def _difference(self, other, sort=None):
876876

877877
def symmetric_difference(
878878
self, other, result_name: Hashable | None = None, sort=None
879-
):
879+
) -> Index:
880880
if not isinstance(other, RangeIndex) or sort is not None:
881881
return super().symmetric_difference(other, result_name, sort)
882882

pandas/core/indexes/timedeltas.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from pandas.core.indexes.extension import inherit_names
3333

3434
if TYPE_CHECKING:
35+
from pandas._libs import NaTType
3536
from pandas._typing import DtypeObj
3637

3738

@@ -245,7 +246,10 @@ def get_loc(self, key):
245246

246247
return Index.get_loc(self, key)
247248

248-
def _parse_with_reso(self, label: str):
249+
# error: Return type "tuple[Timedelta | NaTType, None]" of "_parse_with_reso"
250+
# incompatible with return type "tuple[datetime, Resolution]" in supertype
251+
# "DatetimeIndexOpsMixin"
252+
def _parse_with_reso(self, label: str) -> tuple[Timedelta | NaTType, None]: # type: ignore[override]
249253
# the "with_reso" is a no-op for TimedeltaIndex
250254
parsed = Timedelta(label)
251255
return parsed, None

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -761,5 +761,5 @@ exclude_lines = [
761761
directory = "coverage_html_report"
762762

763763
[tool.codespell]
764-
ignore-words-list = "blocs, coo, hist, nd, sav, ser, recuse, nin, timere, expec, expecs"
764+
ignore-words-list = "blocs, coo, hist, nd, sav, ser, recuse, nin, timere, expec, expecs, indext"
765765
ignore-regex = 'https://([\w/\.])+'

0 commit comments

Comments
 (0)