Skip to content

Commit c8e0105

Browse files
committed
fix(comment): #1397 (comment)
1 parent cda5639 commit c8e0105

File tree

2 files changed

+125
-7
lines changed

2 files changed

+125
-7
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
from typing import Any
2+
3+
import numpy as np
4+
import pandas as pd
5+
import pytest
6+
from typing_extensions import assert_type
7+
8+
from tests import (
9+
TYPE_CHECKING_INVALID_USAGE,
10+
check,
11+
)
12+
13+
14+
@pytest.fixture
15+
def left_i() -> "pd.Index[Any]":
16+
"""left operand"""
17+
lo = pd.MultiIndex.from_tuples([(1,), (2,), (3,)]).levels[0]
18+
return check(assert_type(lo, pd.Index), pd.Index)
19+
20+
21+
def test_mul_py_scalar(left_i: "pd.Index[Any]") -> None:
22+
"""Test pd.Index[Any] (int) * Python native scalars"""
23+
b, i, f, c = True, 1, 1.0, 1j
24+
25+
check(assert_type(left_i * b, pd.Index), pd.Index)
26+
check(assert_type(left_i * i, pd.Index), pd.Index)
27+
check(assert_type(left_i * f, pd.Index), pd.Index)
28+
check(assert_type(left_i * c, pd.Index), pd.Index)
29+
30+
check(assert_type(b * left_i, pd.Index), pd.Index)
31+
check(assert_type(i * left_i, pd.Index), pd.Index)
32+
check(assert_type(f * left_i, pd.Index), pd.Index)
33+
check(assert_type(c * left_i, pd.Index), pd.Index)
34+
35+
36+
def test_mul_py_sequence(left_i: "pd.Index[Any]") -> None:
37+
"""Test pd.Index[Any] (int) * Python native sequences"""
38+
b, i, f, c = [True, False, True], [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
39+
40+
check(assert_type(left_i * b, pd.Index), pd.Index)
41+
check(assert_type(left_i * i, pd.Index), pd.Index)
42+
check(assert_type(left_i * f, pd.Index), pd.Index)
43+
check(assert_type(left_i * c, pd.Index), pd.Index)
44+
45+
check(assert_type(b * left_i, pd.Index), pd.Index)
46+
check(assert_type(i * left_i, pd.Index), pd.Index)
47+
check(assert_type(f * left_i, pd.Index), pd.Index)
48+
check(assert_type(c * left_i, pd.Index), pd.Index)
49+
50+
51+
def test_mul_numpy_array(left_i: "pd.Index[Any]") -> None:
52+
"""Test pd.Index[Any] (int) * numpy arrays"""
53+
b = np.array([True, False, True], np.bool_)
54+
i = np.array([2, 3, 5], np.int64)
55+
f = np.array([1.0, 2.0, 3.0], np.float64)
56+
c = np.array([1.1j, 2.2j, 4.1j], np.complex128)
57+
58+
check(assert_type(left_i * b, pd.Index), pd.Index)
59+
check(assert_type(left_i * i, pd.Index), pd.Index)
60+
check(assert_type(left_i * f, pd.Index), pd.Index)
61+
check(assert_type(left_i * c, pd.Index), pd.Index)
62+
63+
# `numpy` typing gives the corresponding `ndarray`s in the static type
64+
# checking, where our `__rmul__` cannot override. At runtime, they return
65+
# `Index`.
66+
# microsoft/pyright#10924
67+
check(
68+
assert_type(b * left_i, Any), # pyright: ignore[reportAssertTypeFailure]
69+
pd.Index,
70+
)
71+
check(
72+
assert_type(i * left_i, Any), # pyright: ignore[reportAssertTypeFailure]
73+
pd.Index,
74+
)
75+
check(
76+
assert_type(f * left_i, Any), # pyright: ignore[reportAssertTypeFailure]
77+
pd.Index,
78+
)
79+
check(
80+
assert_type(c * left_i, Any), # pyright: ignore[reportAssertTypeFailure]
81+
pd.Index,
82+
)
83+
84+
85+
def test_mul_pd_index(left_i: "pd.Index[Any]") -> None:
86+
"""Test pd.Index[Any] (int) * pandas Indexes"""
87+
a = pd.MultiIndex.from_tuples([(1,), (2,), (3,)]).levels[0]
88+
b = pd.Index([True, False, True])
89+
i = pd.Index([2, 3, 5])
90+
f = pd.Index([1.0, 2.0, 3.0])
91+
c = pd.Index([1.1j, 2.2j, 4.1j])
92+
93+
check(assert_type(left_i * a, pd.Index), pd.Index)
94+
check(assert_type(left_i * b, pd.Index), pd.Index)
95+
check(assert_type(left_i * i, pd.Index), pd.Index)
96+
check(assert_type(left_i * f, pd.Index), pd.Index)
97+
check(assert_type(left_i * c, pd.Index), pd.Index)
98+
99+
check(assert_type(a * left_i, pd.Index), pd.Index)
100+
check(assert_type(b * left_i, pd.Index), pd.Index)
101+
check(assert_type(i * left_i, pd.Index), pd.Index)
102+
check(assert_type(f * left_i, pd.Index), pd.Index)
103+
check(assert_type(c * left_i, pd.Index), pd.Index)
104+
105+
106+
def test_mul_str_py_str(left_i: "pd.Index[Any]") -> None:
107+
"""Test pd.Index[Any] (int) * Python str"""
108+
s = "abc"
109+
110+
if TYPE_CHECKING_INVALID_USAGE:
111+
_0 = left_i * s # type: ignore[operator] # pyright:ignore[reportOperatorIssue]
112+
_1 = s * left_i # type: ignore[operator] # pyright:ignore[reportOperatorIssue]

tests/series/arithmetic/test_mul.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,23 @@
22

33
import numpy as np
44
import pandas as pd
5+
import pytest
56
from typing_extensions import assert_type
67

78
from tests import (
89
TYPE_CHECKING_INVALID_USAGE,
910
check,
1011
)
1112

12-
left_i = pd.DataFrame({"a": [1, 2, 3]})["a"] # left operand
1313

14+
@pytest.fixture
15+
def left_i() -> "pd.Series[Any]":
16+
"""left operand"""
17+
lo = pd.DataFrame({"a": [1, 2, 3]})["a"]
18+
return check(assert_type(lo, pd.Series), pd.Series)
1419

15-
def test_mul_py_scalar() -> None:
20+
21+
def test_mul_py_scalar(left_i: "pd.Series[Any]") -> None:
1622
"""Test pd.Series[Any] (int) * Python native scalars"""
1723
b, i, f, c = True, 1, 1.0, 1j
1824

@@ -37,7 +43,7 @@ def test_mul_py_scalar() -> None:
3743
check(assert_type(left_i.rmul(c), pd.Series), pd.Series)
3844

3945

40-
def test_mul_py_sequence() -> None:
46+
def test_mul_py_sequence(left_i: "pd.Series[Any]") -> None:
4147
"""Test pd.Series[Any] (int) * Python native sequences"""
4248
b, i, f, c = [True, False, True], [2, 3, 5], [1.0, 2.0, 3.0], [1j, 1j, 4j]
4349

@@ -62,7 +68,7 @@ def test_mul_py_sequence() -> None:
6268
check(assert_type(left_i.rmul(c), pd.Series), pd.Series)
6369

6470

65-
def test_mul_numpy_array() -> None:
71+
def test_mul_numpy_array(left_i: "pd.Series[Any]") -> None:
6672
"""Test pd.Series[Any] (int) * numpy arrays"""
6773
b = np.array([True, False, True], np.bool_)
6874
i = np.array([2, 3, 5], np.int64)
@@ -106,7 +112,7 @@ def test_mul_numpy_array() -> None:
106112
check(assert_type(left_i.rmul(c), pd.Series), pd.Series)
107113

108114

109-
def test_mul_pd_index() -> None:
115+
def test_mul_pd_index(left_i: "pd.Series[Any]") -> None:
110116
"""Test pd.Series[Any] (int) * pandas Indexes"""
111117
a = pd.MultiIndex.from_tuples([(1,), (2,), (3,)]).levels[0]
112118
b = pd.Index([True, False, True])
@@ -139,7 +145,7 @@ def test_mul_pd_index() -> None:
139145
check(assert_type(left_i.rmul(c), pd.Series), pd.Series)
140146

141147

142-
def test_mul_pd_series() -> None:
148+
def test_mul_pd_series(left_i: "pd.Series[Any]") -> None:
143149
"""Test pd.Series[Any] (int) * pandas Series"""
144150
a = pd.DataFrame({"a": [1, 2, 3]})["a"]
145151
b = pd.Series([True, False, True])
@@ -172,7 +178,7 @@ def test_mul_pd_series() -> None:
172178
check(assert_type(left_i.rmul(c), pd.Series), pd.Series)
173179

174180

175-
def test_mul_str_py_str() -> None:
181+
def test_mul_str_py_str(left_i: "pd.Series[Any]") -> None:
176182
"""Test pd.Series[Any] (int) * Python str"""
177183
s = "abc"
178184

0 commit comments

Comments
 (0)