Skip to content

Conversation

@cmp0xff
Copy link
Contributor

@cmp0xff cmp0xff commented Oct 28, 2025

@cmp0xff cmp0xff added Index Related to the Index class or subclasses Numeric Operations Arithmetic, Comparison, and Logical operations Series Series data structure labels Oct 28, 2025
@cmp0xff cmp0xff mentioned this pull request Oct 28, 2025
2 tasks
@cmp0xff cmp0xff force-pushed the feature/floordiv branch 4 times, most recently from 3df344a to 674b994 Compare October 31, 2025 11:02
Copy link
Collaborator

@Dr-Irv Dr-Irv left a comment

Choose a reason for hiding this comment

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

A few things:

  1. You're inconsistent when having timedelta divided by int where "divided" is either regular division or floor division, and timedelta is a single element or a sequence of some type. You have that as being not allowed in the stubs, but they work at runtime. Sometimes you do allow it, so you have to fix that.
  2. There are a few places where you say you can't detect via static typing, and I'm surprised at that.

Also, you are making changes here that are independent of supporting floordiv, namely:

  1. You changed the pyrefly override syntax
  2. You changed some imports from from pandas import Series to from pandas.core.series import Series

In the future, if you are making changes where the changes don't have to do with the main intent of the PR, make a separate PR for those changes. E.g., in the above case, you could do one for pyrefly and another to change the imports.

if TYPE_CHECKING_INVALID_USAGE:
_13 = c // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_14 = s // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_15 = d // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
Copy link
Collaborator

Choose a reason for hiding this comment

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

Bit surprised here that timedelta // left works but a list[timedelta] // left does not.. Shouldn't it have picked up Index[float].__rfloordiv__(list[timedelta]) ?

check(assert_type(c / left, "pd.Index[complex]"), pd.Index, np.complexfloating)
if TYPE_CHECKING_INVALID_USAGE:
_14 = s / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_15 = d / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
Copy link
Collaborator

Choose a reason for hiding this comment

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

same comment as in indexes/test_floordiv.py . This does work:

>>> left = pd.Index([1.0, 2.0, 3.0])
>>> from datetime import timedelta
>>> d = [timedelta(seconds=s) for s in (1, 2, 3)]
>>> d / left
Index([0:00:01, 0:00:01, 0:00:01], dtype='object')

if TYPE_CHECKING_INVALID_USAGE:
_13 = c // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_14 = s // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_15 = d // left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
Copy link
Collaborator

Choose a reason for hiding this comment

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

same comment - this should work

if TYPE_CHECKING_INVALID_USAGE:
assert_type(c // left, Any)
assert_type(s // left, Any)
assert_type(d // left, "np.typing.NDArray[np.int64]")
Copy link
Collaborator

Choose a reason for hiding this comment

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

this works

check(assert_type(c / left, "pd.Index[complex]"), pd.Index, np.complexfloating)
if TYPE_CHECKING_INVALID_USAGE:
_14 = s / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_15 = d / left # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
Copy link
Collaborator

Choose a reason for hiding this comment

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

this works

if TYPE_CHECKING_INVALID_USAGE:
left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
# left_i.floordiv(d) # This invalid one cannot be detected by static type checking
Copy link
Collaborator

Choose a reason for hiding this comment

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

This is very surprising. You were able to detect that left_i // d is invalid, so you should be able to do this one.

if TYPE_CHECKING_INVALID_USAGE:
_03 = left_i // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_04 = left_i // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
# _05 = left_i // d # This invalid one cannot be detected by static type checking
Copy link
Collaborator

Choose a reason for hiding this comment

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

A bit surprising, but then I see that you didn't add s and d in the tests in tests/series/arithmetic/test_truediv.py, so you should add that and things should be the same between floordiv and truediv

if TYPE_CHECKING_INVALID_USAGE:
left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
# left_i.floordiv(d) # This invalid one cannot be detected by static type checking
Copy link
Collaborator

Choose a reason for hiding this comment

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

surprised at this

if TYPE_CHECKING_INVALID_USAGE:
_03 = left_i // c # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
_04 = left_i // s # type: ignore[operator] # pyright: ignore[reportOperatorIssue]
# _05 = left_i // d # This invalid one cannot be detected by static type checking
Copy link
Collaborator

Choose a reason for hiding this comment

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

same comment

if TYPE_CHECKING_INVALID_USAGE:
left_i.floordiv(c) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
left_i.floordiv(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType,reportCallIssue]
# left_i.floordiv(d) # This invalid one cannot be detected by static type checking
Copy link
Collaborator

Choose a reason for hiding this comment

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

same comment

@cmp0xff cmp0xff marked this pull request as draft November 4, 2025 22:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Index Related to the Index class or subclasses Numeric Operations Arithmetic, Comparison, and Logical operations Series Series data structure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants