Skip to content

Commit 1dce75b

Browse files
twoertweinGogowitsch
authored andcommitted
TYP: misc Index return types (#57256)
* TYP: misc Index return types * add IndexT to ignore list
1 parent 5bbd98b commit 1dce75b

File tree

10 files changed

+24
-14
lines changed

10 files changed

+24
-14
lines changed

pandas/_typing.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ def __reversed__(self) -> Iterator[_T_co]:
179179
# passed in, a DataFrame is always returned.
180180
NDFrameT = TypeVar("NDFrameT", bound="NDFrame")
181181

182+
IndexT = TypeVar("IndexT", bound="Index")
182183
NumpyIndexT = TypeVar("NumpyIndexT", np.ndarray, "Index")
183184

184185
AxisInt = int

pandas/core/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11280,7 +11280,7 @@ def _shift_with_freq(self, periods: int, axis: int, freq) -> Self:
1128011280
f"does not match PeriodIndex freq "
1128111281
f"{freq_to_period_freqstr(orig_freq.n, orig_freq.name)}"
1128211282
)
11283-
new_ax = index.shift(periods)
11283+
new_ax: Index = index.shift(periods)
1128411284
else:
1128511285
new_ax = index.shift(periods, freq)
1128611286

pandas/core/indexes/accessors.py

Lines changed: 3 additions & 2 deletions
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
@@ -117,7 +118,7 @@ def _delegate_property_get(self, name: str):
117118

118119
return result
119120

120-
def _delegate_property_set(self, name: str, value, *args, **kwargs):
121+
def _delegate_property_set(self, name: str, value, *args, **kwargs) -> NoReturn:
121122
raise ValueError(
122123
"modifications to a property of a datetimelike object are not supported. "
123124
"Change values on the original."
@@ -501,7 +502,7 @@ def to_pytimedelta(self) -> np.ndarray:
501502
return self._get_values().to_pytimedelta()
502503

503504
@property
504-
def components(self):
505+
def components(self) -> DataFrame:
505506
"""
506507
Return a Dataframe of the components of the Timedeltas.
507508

pandas/core/indexes/base.py

Lines changed: 4 additions & 3 deletions
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,
@@ -2030,7 +2031,7 @@ def sortlevel(
20302031
ascending: bool | list[bool] = True,
20312032
sort_remaining=None,
20322033
na_position: NaPosition = "first",
2033-
):
2034+
) -> tuple[Self, np.ndarray]:
20342035
"""
20352036
For internal compatibility with the Index API.
20362037
@@ -4444,7 +4445,7 @@ def _wrap_reindex_result(self, target, indexer, preserve_names: bool):
44444445
target = self._maybe_preserve_names(target, preserve_names)
44454446
return target
44464447

4447-
def _maybe_preserve_names(self, target: Index, preserve_names: bool):
4448+
def _maybe_preserve_names(self, target: IndexT, preserve_names: bool) -> IndexT:
44484449
if preserve_names and target.nlevels == 1 and target.name != self.name:
44494450
target = target.copy(deep=False)
44504451
target.name = self.name
@@ -5965,7 +5966,7 @@ def sort(self, *args, **kwargs):
59655966
"""
59665967
raise TypeError("cannot sort an Index object in-place, use sort_values instead")
59675968

5968-
def shift(self, periods: int = 1, freq=None):
5969+
def shift(self, periods: int = 1, freq=None) -> Self:
59695970
"""
59705971
Shift index by desired number of time frequency increments.
59715972

pandas/core/indexes/datetimelike.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ def _can_partial_date_slice(self, reso: Resolution) -> bool:
272272
def _parsed_string_to_bounds(self, reso: Resolution, parsed):
273273
raise NotImplementedError
274274

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

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

pandas/core/indexes/datetimes.py

Lines changed: 4 additions & 2 deletions
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

Lines changed: 2 additions & 1 deletion
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,
@@ -2741,7 +2742,7 @@ def _wrap_reindex_result(self, target, indexer, preserve_names: bool):
27412742
target = self._maybe_preserve_names(target, preserve_names)
27422743
return target
27432744

2744-
def _maybe_preserve_names(self, target: Index, preserve_names: bool) -> Index:
2745+
def _maybe_preserve_names(self, target: IndexT, preserve_names: bool) -> IndexT:
27452746
if (
27462747
preserve_names
27472748
and target.nlevels == self.nlevels

pandas/core/indexes/range.py

Lines changed: 1 addition & 1 deletion
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

Lines changed: 5 additions & 1 deletion
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,5 +812,5 @@ exclude_lines = [
812812
directory = "coverage_html_report"
813813

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

0 commit comments

Comments
 (0)