Skip to content

Commit 73e308b

Browse files
committed
ensured typing hints consistency, closes issue 14833
1 parent 6b0d0ab commit 73e308b

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

pandas/core/indexes/multi.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3841,14 +3841,16 @@ def searchsorted(
38413841
array([1])
38423842
"""
38433843

3844-
if not value:
3845-
raise ValueError("searchsorted requires a non-empty value")
3846-
3847-
if not isinstance(value, (tuple, list)):
3848-
raise TypeError("value must be a tuple or list")
3849-
38503844
if isinstance(value, tuple):
38513845
value = [value]
3846+
elif isinstance(value, (list, np.ndarray, ExtensionArray)):
3847+
if len(value) == 0:
3848+
raise ValueError("searchsorted requires a non-empty sequence")
3849+
else:
3850+
raise TypeError(
3851+
"value must be a tuple (scalar key), or a list/numpy"
3852+
"array/ExtensionArray of tuples"
3853+
)
38523854

38533855
if side not in ["left", "right"]:
38543856
raise ValueError("side must be either 'left' or 'right'")
@@ -3861,22 +3863,24 @@ def searchsorted(
38613863
val = i if side == "left" else i + 1
38623864
result.append(np.intp(val))
38633865
else:
3864-
dtype = np.dtype(
3865-
[
3866-
(f"level_{i}", np.asarray(level).dtype)
3867-
for i, level in enumerate(self.levels)
3868-
]
3869-
)
3866+
fields = []
3867+
for i, level in enumerate(self.levels):
3868+
level_dtype = level.dtype
3869+
if isinstance(level_dtype, ExtensionDtype):
3870+
fields.append((f"level_{i}", object))
3871+
else:
3872+
fields.append((f"level_{i}", level_dtype))
3873+
dtype = np.dtype(fields)
38703874

38713875
val_array = np.array([v], dtype=dtype)
3872-
38733876
pos = np.searchsorted(
38743877
np.asarray(self.values, dtype=dtype),
38753878
val_array,
38763879
side=side,
38773880
sorter=sorter,
38783881
)
38793882
result.append(np.intp(pos[0]))
3883+
38803884
if len(result) == 1:
38813885
return result[0]
38823886
return np.array(result, dtype=np.intp)

pandas/tests/indexes/multi/test_indexing.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,15 @@ def test_searchsorted_list(mi, values, side, expected):
10761076
"value, side, error_type, match",
10771077
[
10781078
(("a", 1), "middle", ValueError, "side must be either 'left' or 'right'"),
1079-
("a", "left", TypeError, "value must be a tuple or list"),
1079+
(
1080+
"a",
1081+
"left",
1082+
TypeError,
1083+
re.escape(
1084+
"value must be a tuple (scalar key), or a list/numpy"
1085+
"array/ExtensionArray of tuples"
1086+
),
1087+
),
10801088
],
10811089
ids=["invalid-side", "invalid-value-type"],
10821090
)

0 commit comments

Comments
 (0)