Skip to content

Conversation

@LirongMa
Copy link
Contributor

@LirongMa LirongMa commented Oct 3, 2025

Changes for #55152

@LirongMa LirongMa changed the title [Issue 55152]: Add allow_slice to is_hashable function CLN: Add allow_slice to is_hashable function Oct 3, 2025
@LirongMa LirongMa marked this pull request as ready for review October 5, 2025 20:27
@jbrockmendel
Copy link
Member

Are there non-test places where this is needed?

@LirongMa
Copy link
Contributor Author

LirongMa commented Oct 8, 2025

Are there non-test places where this is needed?

not so far. Because in your PR(#53743 (comment)) you added the checks along with the call to is_hashable(). I added this 'allow_slice' argument based on Richard's suggestion (#55152 (comment))

Let me make some changes to some of the callers and set 'allow_slice' to be False.

@LirongMa LirongMa requested a review from rhshadrach as a code owner October 13, 2025 01:35
)

try:
self._book = Workbook(self._handles.handle, **engine_kwargs) # type: ignore[arg-type]
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mypy failed on this comment.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jbrockmendel I made changes based on your feedback. Please review.

If `allow_slice` is False, objects that are slices or tuples containing slices
will always return False, even if hash(obj) would succeed.
If `allow_slice` is True or None, slices and tuples containing slices are treated as
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is None needed?

Copy link
Contributor Author

@LirongMa LirongMa Oct 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

None is a default value. So for exsiting callers, I don't need to set allow_slice. Unless you want me to change all the callers of is_hahsable and set the allow_slice to be True (if they don't have extra checks for slice). Please let me know.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just set the default to True.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, set the default to be True now.

If `allow_slice` is False, objects that are slices or tuples containing slices
will always return False, even if hash(obj) would succeed.
If `allow_slice` is True, slices and tuples containing slices are treated as
hashable if hash(obj) does not raise TypeError.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this extra comment is unnecessary given the description in the parameters section

# This should never be reached, but let's be explicit about it
raise ValueError("Too many indices") # pragma: no cover
if all(
(is_hashable(x) and not _contains_slice(x)) or com.is_null_slice(x)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this is the only usage of _contains_slice, so that can be removed?


if is_scalar(key) or (
isinstance(labels, MultiIndex) and is_hashable(key) and not contains_slice
isinstance(labels, MultiIndex) and is_hashable(key, allow_slice=False)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this changes logic slightly by disallowing slice keys whereas the old code just disallowed tuples-containing-slice?

def __hash__(self):
raise TypeError("Not hashable")

class HashableSlice:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comment that we can get rid of that once we drop py311?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants