diff --git a/pandas-stubs/core/indexes/base.pyi b/pandas-stubs/core/indexes/base.pyi index 704053c2..0d7b440e 100644 --- a/pandas-stubs/core/indexes/base.pyi +++ b/pandas-stubs/core/indexes/base.pyi @@ -58,6 +58,7 @@ from pandas._typing import ( NaPosition, ReindexMethod, Scalar, + SequenceNotStr, SliceType, TimedeltaDtypeArg, TimestampDtypeArg, @@ -316,11 +317,11 @@ class Index(IndexOpsMixin[S1]): @property def name(self) -> Hashable | None: ... @name.setter - def name(self, value) -> None: ... + def name(self, value: Hashable) -> None: ... @property - def names(self) -> list[Hashable]: ... + def names(self) -> list[Hashable | None]: ... @names.setter - def names(self, names: Sequence[Hashable]) -> None: ... + def names(self, names: SequenceNotStr[Hashable | None]) -> None: ... def set_names(self, names, *, level=..., inplace: bool = ...): ... @overload def rename(self, name, *, inplace: Literal[False] = False) -> Self: ... diff --git a/tests/test_indexes.py b/tests/test_indexes.py index e619151b..6286d741 100644 --- a/tests/test_indexes.py +++ b/tests/test_indexes.py @@ -1,5 +1,6 @@ from __future__ import annotations +from collections.abc import Hashable import datetime as dt from typing import ( TYPE_CHECKING, @@ -1433,3 +1434,23 @@ def test_multiindex_range() -> None: [range(3), pd.Series([2, 3, 5])], ) check(assert_type(midx_mixed_types, pd.MultiIndex), pd.MultiIndex) + + +def test_index_naming() -> None: + """ + Test index names type both for the getter and the setter. + The names of an index should be settable with a sequence (not str) and names + property is a list[Hashable | None] (FrozenList). + """ + df = pd.DataFrame({"a": ["a", "b", "c"], "i": [10, 11, 12]}) + + df.index.names = ["idx"] + check(assert_type(df.index.names, list[Hashable | None]), list) + df.index.names = [3] + check(assert_type(df.index.names, list[Hashable | None]), list) + df.index.names = ("idx2",) + check(assert_type(df.index.names, list[Hashable | None]), list) + df.index.names = [None] + check(assert_type(df.index.names, list[Hashable | None]), list) + df.index.names = (None,) + check(assert_type(df.index.names, list[Hashable | None]), list)