From 7719d89d45e98aaf3f71d229ddb650ed0147bba1 Mon Sep 17 00:00:00 2001 From: Joanna Ge Date: Wed, 26 Apr 2023 15:38:52 -0400 Subject: [PATCH 1/5] Cast return values to int --- pandas/core/arrays/_ranges.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index f2582cd6f2e58..ef1804aefe361 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -181,9 +181,7 @@ def _generate_range_overflow_safe_signed( # Putting this into a DatetimeArray/TimedeltaArray # would incorrectly be interpreted as NaT raise OverflowError - # error: Incompatible return value type (got "signedinteger[_64Bit]", - # expected "int") - return result # type: ignore[return-value] + return int(result) except (FloatingPointError, OverflowError): # with endpoint negative and addend positive we risk # FloatingPointError; with reversed signed we risk OverflowError @@ -204,9 +202,7 @@ def _generate_range_overflow_safe_signed( i64max = np.uint64(i8max) assert result > i64max if result <= i64max + np.uint64(stride): - # error: Incompatible return value type (got "unsignedinteger", expected - # "int") - return result # type: ignore[return-value] + return int(result) raise OutOfBoundsDatetime( f"Cannot generate range with {side}={endpoint} and periods={periods}" From 04a39bf8b7dcd502e8a9c74821349f105a42bbce Mon Sep 17 00:00:00 2001 From: Joanna Ge Date: Fri, 28 Apr 2023 15:26:52 -0400 Subject: [PATCH 2/5] Remove mypy error comment --- pandas/core/arrays/_ranges.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index ef1804aefe361..56aae34f2482e 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -96,7 +96,7 @@ def generate_regular_range( def _generate_range_overflow_safe( endpoint: int, periods: int, stride: int, side: str = "start" -) -> int: +) -> np.int64: """ Calculate the second endpoint for passing to np.arange, checking to avoid an integer overflow. Catch OverflowError and re-raise @@ -157,13 +157,13 @@ def _generate_range_overflow_safe( remaining = periods - mid_periods assert 0 < remaining < periods, (remaining, periods, endpoint, stride) - midpoint = _generate_range_overflow_safe(endpoint, mid_periods, stride, side) + midpoint = int(_generate_range_overflow_safe(endpoint, mid_periods, stride, side)) return _generate_range_overflow_safe(midpoint, remaining, stride, side) def _generate_range_overflow_safe_signed( endpoint: int, periods: int, stride: int, side: str -) -> int: +) -> np.int64: """ A special case for _generate_range_overflow_safe where `periods * stride` can be calculated without overflowing int64 bounds. @@ -181,7 +181,7 @@ def _generate_range_overflow_safe_signed( # Putting this into a DatetimeArray/TimedeltaArray # would incorrectly be interpreted as NaT raise OverflowError - return int(result) + return result except (FloatingPointError, OverflowError): # with endpoint negative and addend positive we risk # FloatingPointError; with reversed signed we risk OverflowError @@ -196,13 +196,11 @@ def _generate_range_overflow_safe_signed( # exceed implementation bounds, but when passing the result to # np.arange will get a result slightly within the bounds - # error: Incompatible types in assignment (expression has type - # "unsignedinteger[_64Bit]", variable has type "signedinteger[_64Bit]") - result = np.uint64(endpoint) + np.uint64(addend) # type: ignore[assignment] + result = np.uint64(endpoint) + np.uint64(addend) i64max = np.uint64(i8max) assert result > i64max if result <= i64max + np.uint64(stride): - return int(result) + result raise OutOfBoundsDatetime( f"Cannot generate range with {side}={endpoint} and periods={periods}" From 46688e2275f93643f9057ec590ca5a51d0e371a9 Mon Sep 17 00:00:00 2001 From: Joanna Ge Date: Fri, 28 Apr 2023 15:30:20 -0400 Subject: [PATCH 3/5] Add return statement to function --- pandas/core/arrays/_ranges.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index 56aae34f2482e..bf795c06cd407 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -200,7 +200,7 @@ def _generate_range_overflow_safe_signed( i64max = np.uint64(i8max) assert result > i64max if result <= i64max + np.uint64(stride): - result + return result raise OutOfBoundsDatetime( f"Cannot generate range with {side}={endpoint} and periods={periods}" From 77ff3ba1fe2292be4309b462f733b44249c08329 Mon Sep 17 00:00:00 2001 From: Joanna Ge Date: Sun, 7 May 2023 04:41:32 -0400 Subject: [PATCH 4/5] Change function signatures --- pandas/core/arrays/_ranges.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index bf795c06cd407..113b34a2faa75 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -96,7 +96,7 @@ def generate_regular_range( def _generate_range_overflow_safe( endpoint: int, periods: int, stride: int, side: str = "start" -) -> np.int64: +) -> np.int64 | np.uint64: """ Calculate the second endpoint for passing to np.arange, checking to avoid an integer overflow. Catch OverflowError and re-raise @@ -115,7 +115,7 @@ def _generate_range_overflow_safe( Returns ------- - other_end : int + other_end : np.int64 | np.uint64 Raises ------ @@ -163,7 +163,7 @@ def _generate_range_overflow_safe( def _generate_range_overflow_safe_signed( endpoint: int, periods: int, stride: int, side: str -) -> np.int64: +) -> np.int64 | np.uint64: """ A special case for _generate_range_overflow_safe where `periods * stride` can be calculated without overflowing int64 bounds. From 79afd7b8e0d471af9d0ec06cfb0e981e11728621 Mon Sep 17 00:00:00 2001 From: Joanna Ge Date: Sun, 7 May 2023 05:24:48 -0400 Subject: [PATCH 5/5] Add type annotation to variables --- pandas/core/arrays/_ranges.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index 113b34a2faa75..5f0409188e5e3 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -54,6 +54,8 @@ def generate_regular_range( iend = end._value if end is not None else None freq.nanos # raises if non-fixed frequency td = Timedelta(freq) + b: int | np.int64 | np.uint64 + e: int | np.int64 | np.uint64 try: td = td.as_unit( # pyright: ignore[reportGeneralTypeIssues] unit, round_ok=False @@ -196,11 +198,11 @@ def _generate_range_overflow_safe_signed( # exceed implementation bounds, but when passing the result to # np.arange will get a result slightly within the bounds - result = np.uint64(endpoint) + np.uint64(addend) + uresult = np.uint64(endpoint) + np.uint64(addend) i64max = np.uint64(i8max) - assert result > i64max - if result <= i64max + np.uint64(stride): - return result + assert uresult > i64max + if uresult <= i64max + np.uint64(stride): + return uresult raise OutOfBoundsDatetime( f"Cannot generate range with {side}={endpoint} and periods={periods}"