Python 3.14: bump fractions stubs (#14215)

This commit is contained in:
Andrii Hrimov
2025-06-03 20:15:25 +02:00
committed by GitHub
parent 2a742fd860
commit 567b488fc2
3 changed files with 37 additions and 16 deletions
@@ -9,8 +9,6 @@ compression.gzip.GzipFile.readinto
compression.gzip.GzipFile.readinto1
compression.gzip.GzipFile.readinto1
compression.gzip.compress
fractions.Fraction.__pow__
fractions.Fraction.__rpow__
gzip.GzipFile.readinto
gzip.GzipFile.readinto1
gzip.compress
+12 -4
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
import sys
from decimal import Decimal
from fractions import Fraction
from typing import Any, Literal
@@ -47,9 +48,6 @@ assert_type(pow(complex(6), 6.2), complex)
assert_type(complex(6) ** 6.2, complex)
assert_type(pow(complex(9), 7.3, None), complex)
# pyright infers Fraction | float | complex, while mypy infers Fraction.
# This is probably because of differences in @overload handling.
assert_type(pow(Fraction(), 4, None), Fraction) # pyright: ignore[reportAssertTypeFailure]
assert_type(Fraction() ** 4, Fraction)
assert_type(pow(Fraction(3, 7), complex(1, 8)), complex)
@@ -85,12 +83,22 @@ assert_type(pow(4.7, 9.2, None), Any)
# See #7046 -- float for a positive 1st arg, complex otherwise
assert_type((-95) ** 8.42, Any)
# Fraction.__pow__/__rpow__ with modulo parameter
# With the None parameter, we get the correct type, but with a non-None parameter, we receive TypeError
if sys.version_info >= (3, 14):
# pyright infers Fraction | float | complex, while mypy infers Fraction.
# This is probably because of differences in @overload handling.
assert_type(pow(Fraction(3, 4), 2, None), Fraction) # pyright: ignore[reportAssertTypeFailure]
# Non-none modulo should fail
pow(Fraction(3, 4), 2, 1) # type: ignore[misc]
else:
pow(Fraction(), 5, 8) # type: ignore
# All of the following cases should fail a type-checker.
pow(1.9, 4, 6) # type: ignore
pow(4, 7, 4.32) # type: ignore
pow(6.2, 5.9, 73) # type: ignore
pow(complex(6), 6.2, 7) # type: ignore
pow(Fraction(), 5, 8) # type: ignore
Decimal("8.7") ** 3.14 # type: ignore
# TODO: This fails at runtime, but currently passes mypy and pyright:
+25 -10
View File
@@ -107,16 +107,31 @@ class Fraction(Rational):
def __rdivmod__(a, b: int | Fraction) -> tuple[int, Fraction]: ...
@overload
def __rdivmod__(a, b: float) -> tuple[float, Fraction]: ...
@overload
def __pow__(a, b: int) -> Fraction: ...
@overload
def __pow__(a, b: float | Fraction) -> float: ...
@overload
def __pow__(a, b: complex) -> complex: ...
@overload
def __rpow__(b, a: float | Fraction) -> float: ...
@overload
def __rpow__(b, a: complex) -> complex: ...
if sys.version_info >= (3, 14):
@overload
def __pow__(a, b: int, modulo: None = None) -> Fraction: ...
@overload
def __pow__(a, b: float | Fraction, modulo: None = None) -> float: ...
@overload
def __pow__(a, b: complex, modulo: None = None) -> complex: ...
else:
@overload
def __pow__(a, b: int) -> Fraction: ...
@overload
def __pow__(a, b: float | Fraction) -> float: ...
@overload
def __pow__(a, b: complex) -> complex: ...
if sys.version_info >= (3, 14):
@overload
def __rpow__(b, a: float | Fraction, modulo: None = None) -> float: ...
@overload
def __rpow__(b, a: complex, modulo: None = None) -> complex: ...
else:
@overload
def __rpow__(b, a: float | Fraction) -> float: ...
@overload
def __rpow__(b, a: complex) -> complex: ...
def __pos__(a) -> Fraction: ...
def __neg__(a) -> Fraction: ...
def __abs__(a) -> Fraction: ...