diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 1bcd4746c7a3..24a46b66cc3c 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -266,8 +266,6 @@ class int: @overload def __pow__(self, __x: int, __modulo: None = ...) -> Any: ... @overload - def __pow__(self, __x: int, __modulo: Literal[0]) -> NoReturn: ... - @overload def __pow__(self, __x: int, __modulo: int) -> int: ... def __rpow__(self, __x: int, __mod: int | None = ...) -> Any: ... def __and__(self, __n: int) -> int: ... @@ -1548,8 +1546,8 @@ _SupportsSomeKindOfPow = ( # noqa: Y026 # TODO: Use TypeAlias once mypy bugs a ) if sys.version_info >= (3, 8): - @overload - def pow(base: int, exp: int, mod: Literal[0]) -> NoReturn: ... + # TODO: `pow(int, int, Literal[0])` fails at runtime, + # but adding a `NoReturn` overload isn't a good solution for expressing that (see #8566). @overload def pow(base: int, exp: int, mod: int) -> int: ... @overload @@ -1587,8 +1585,6 @@ if sys.version_info >= (3, 8): def pow(base: _SupportsSomeKindOfPow, exp: complex, mod: None = ...) -> complex: ... else: - @overload - def pow(__base: int, __exp: int, __mod: Literal[0]) -> NoReturn: ... @overload def pow(__base: int, __exp: int, __mod: int) -> int: ... @overload diff --git a/test_cases/stdlib/builtins/test_pow.py b/test_cases/stdlib/builtins/test_pow.py index 217cd53045ff..732dfca58d54 100644 --- a/test_cases/stdlib/builtins/test_pow.py +++ b/test_cases/stdlib/builtins/test_pow.py @@ -2,7 +2,7 @@ from decimal import Decimal from fractions import Fraction -from typing import Any, NoReturn +from typing import Any from typing_extensions import Literal, assert_type # See #7163 @@ -10,7 +10,11 @@ assert_type(1**0, Literal[1]) assert_type(pow(1, 0, None), Literal[1]) -assert_type(pow(2, 4, 0), NoReturn) +# TODO: We don't have a good way of expressing the fact +# that passing 0 for the third argument will lead to an exception being raised +# (see discussion in #8566) +# +# assert_type(pow(2, 4, 0), NoReturn) assert_type(pow(2, 4), int) assert_type(2**4, int)