-
-
Notifications
You must be signed in to change notification settings - Fork 146
feat(index): append #1282
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
feat(index): append #1282
Changes from all commits
390e5d9
3a34057
45e0ad3
6c8ba76
3844062
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,7 @@ from typing import ( | |
ClassVar, | ||
Literal, | ||
TypeAlias, | ||
TypeVar, | ||
final, | ||
overload, | ||
) | ||
|
@@ -43,6 +44,7 @@ from typing_extensions import ( | |
from pandas._libs.interval import _OrderableT | ||
from pandas._typing import ( | ||
S1, | ||
S2, | ||
AnyAll, | ||
AxesData, | ||
DropKeep, | ||
|
@@ -64,6 +66,8 @@ from pandas._typing import ( | |
type_t, | ||
) | ||
|
||
_T_INDEX = TypeVar("_T_INDEX", bound=Index) # ty: ignore[unresolved-reference] | ||
|
||
class InvalidIndexError(Exception): ... | ||
|
||
class Index(IndexOpsMixin[S1]): | ||
|
@@ -401,7 +405,14 @@ class Index(IndexOpsMixin[S1]): | |
) -> Self: ... | ||
@overload | ||
def __getitem__(self, idx: int | tuple[np_ndarray_anyint, ...]) -> S1: ... | ||
def append(self, other): ... | ||
@overload | ||
def append(self, other: Index[S1] | Sequence[Index[S1]]) -> Self: ... | ||
@overload | ||
def append(self, other: Index[S2] | Sequence[Index[S2]]) -> Index[S1 | S2]: ... | ||
@overload | ||
def append(self, other: Sequence[_T_INDEX]) -> Self | _T_INDEX: ... | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why can't we use |
||
@overload | ||
def append(self, other: Index | Sequence) -> Index: ... | ||
def putmask(self, mask, value): ... | ||
def equals(self, other) -> bool: ... | ||
@final | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,9 @@ | |
import datetime as dt | ||
from typing import ( | ||
TYPE_CHECKING, | ||
Any, | ||
Union, | ||
cast, | ||
) | ||
|
||
import numpy as np | ||
|
@@ -1028,6 +1030,66 @@ def test_getitem() -> None: | |
check(assert_type(i0[[0, 2]], "pd.Index[str]"), pd.Index, str) | ||
|
||
|
||
def test_append_mix() -> None: | ||
"""Test pd.Index.append that gives pd.Index[Any]""" | ||
first = pd.Index([1]) | ||
second = pd.Index(["a"]) | ||
third = pd.Index([1, "a"]) | ||
check(assert_type(first.append(second), "pd.Index[int | str]"), pd.Index) | ||
check(assert_type(first.append([second]), "pd.Index[int | str]"), pd.Index) | ||
|
||
check(assert_type(first.append(third), "pd.Index[int | str]"), pd.Index) # type: ignore[assert-type] | ||
check(assert_type(first.append([third]), "pd.Index[int | str]"), pd.Index) # type: ignore[assert-type] | ||
check( | ||
assert_type( # type: ignore[assert-type] | ||
first.append([second, third]), # pyright: ignore[reportAssertTypeFailure] | ||
"pd.Index[int | str]", | ||
), | ||
pd.Index, | ||
) | ||
|
||
check(assert_type(third.append([]), "pd.Index[int | str]"), pd.Index) # type: ignore[assert-type] | ||
check( | ||
assert_type(third.append(cast("list[Index[Any]]", [])), "pd.Index[int | str]"), # type: ignore[assert-type] | ||
pd.Index, | ||
) | ||
check(assert_type(third.append([first]), "pd.Index[int | str]"), pd.Index) # type: ignore[assert-type] | ||
check( | ||
assert_type( # type: ignore[assert-type] | ||
third.append([first, second]), # pyright: ignore[reportAssertTypeFailure] | ||
"pd.Index[int | str]", | ||
), | ||
pd.Index, | ||
Comment on lines
+1041
to
+1062
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. these tests need to work without having |
||
) | ||
|
||
|
||
def test_append_int() -> None: | ||
"""Test pd.Index[int].append""" | ||
first = pd.Index([1]) | ||
second = pd.Index([2]) | ||
check(assert_type(first.append([]), "pd.Index[int]"), pd.Index, np.int64) | ||
check(assert_type(first.append(second), "pd.Index[int]"), pd.Index, np.int64) | ||
check(assert_type(first.append([second]), "pd.Index[int]"), pd.Index, np.int64) | ||
|
||
|
||
def test_append_str() -> None: | ||
"""Test pd.Index[str].append""" | ||
first = pd.Index(["str"]) | ||
second = pd.Index(["rts"]) | ||
check(assert_type(first.append([]), "pd.Index[str]"), pd.Index, str) | ||
check(assert_type(first.append(second), "pd.Index[str]"), pd.Index, str) | ||
check(assert_type(first.append([second]), "pd.Index[str]"), pd.Index, str) | ||
|
||
|
||
def test_append_list_str() -> None: | ||
"""Test pd.Index[list[str]].append""" | ||
first = pd.Index([["str", "rts"]]) | ||
second = pd.Index([["srt", "trs"]]) | ||
check(assert_type(first.append([]), "pd.Index[list[str]]"), pd.Index, list) | ||
check(assert_type(first.append(second), "pd.Index[list[str]]"), pd.Index, list) | ||
check(assert_type(first.append([second]), "pd.Index[list[str]]"), pd.Index, list) | ||
Comment on lines
+1085
to
+1090
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think we should be supporting But this is a bug in So can you remove this test. Then we will have to separate out So can you make that change as well? |
||
|
||
|
||
def test_range_index_range() -> None: | ||
"""Test that pd.RangeIndex can be initialized from range.""" | ||
iri = pd.RangeIndex(range(5)) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think that's right. I think the result would be
Index[S1] | Index[S2]
.I'm not sure how the downstream
Index
stuff would work with the union type inside the generic.