From 39fe41214788559f9e7fdc3a37bbf5a9a8af91e2 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Mon, 20 Jul 2026 17:28:23 +0200 Subject: [PATCH 1/5] builtins.callable: use TypeIs[Callable[..., Any]] rather than TypeIs[Callable] --- stdlib/@tests/test_cases/builtins/check_callable.py | 6 ++++++ stdlib/builtins.pyi | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 stdlib/@tests/test_cases/builtins/check_callable.py diff --git a/stdlib/@tests/test_cases/builtins/check_callable.py b/stdlib/@tests/test_cases/builtins/check_callable.py new file mode 100644 index 000000000000..ec1024ed1133 --- /dev/null +++ b/stdlib/@tests/test_cases/builtins/check_callable.py @@ -0,0 +1,6 @@ +from typing import Any + + +def test_gradual_assignment(arg: Any) -> None: + if callable(arg): + _: int = arg() diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 096d440ac38c..372cfe7de5d3 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1568,7 +1568,7 @@ else: def bin(number: SupportsIndex, /) -> str: ... def breakpoint(*args: Any, **kws: Any) -> None: ... -def callable(obj: object, /) -> TypeIs[Callable[..., object]]: ... +def callable(obj: object, /) -> TypeIs[Callable[..., Any]]: ... def chr(i: SupportsIndex, /) -> str: ... def aiter(async_iterable: SupportsAiter[_SupportsAnextT_co], /) -> _SupportsAnextT_co: ... From c93781bdeacb27d06e67c557ca67e524079e5320 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Mon, 20 Jul 2026 19:33:24 +0200 Subject: [PATCH 2/5] clarified gradual guarantee in test --- stdlib/@tests/test_cases/builtins/check_callable.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/stdlib/@tests/test_cases/builtins/check_callable.py b/stdlib/@tests/test_cases/builtins/check_callable.py index ec1024ed1133..9e111bd21842 100644 --- a/stdlib/@tests/test_cases/builtins/check_callable.py +++ b/stdlib/@tests/test_cases/builtins/check_callable.py @@ -1,6 +1,8 @@ from typing import Any -def test_gradual_assignment(arg: Any) -> None: +def check_gradual_guarantee(arg: Any) -> int: + # if Any materialized to `Callable[[], int] | None`, this function type checks if callable(arg): - _: int = arg() + return arg() # OK + return -1 From e0d30f9184418d2c04a272d7bfacb7d47733de1f Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Mon, 20 Jul 2026 19:53:32 +0200 Subject: [PATCH 3/5] check_callable: add type ignore for no-any-return in callable check --- stdlib/@tests/test_cases/builtins/check_callable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/@tests/test_cases/builtins/check_callable.py b/stdlib/@tests/test_cases/builtins/check_callable.py index 9e111bd21842..0e5013b5c823 100644 --- a/stdlib/@tests/test_cases/builtins/check_callable.py +++ b/stdlib/@tests/test_cases/builtins/check_callable.py @@ -4,5 +4,5 @@ def check_gradual_guarantee(arg: Any) -> int: # if Any materialized to `Callable[[], int] | None`, this function type checks if callable(arg): - return arg() # OK + return arg() # type: ignore[no-any-return] return -1 From ac81749a57ec09ce0f28d6e81df263d859678da5 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Mon, 20 Jul 2026 20:04:52 +0200 Subject: [PATCH 4/5] check_callable: add unnecessary type ignore comment for pyright --- stdlib/@tests/test_cases/builtins/check_callable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/@tests/test_cases/builtins/check_callable.py b/stdlib/@tests/test_cases/builtins/check_callable.py index 0e5013b5c823..56c065b451e9 100644 --- a/stdlib/@tests/test_cases/builtins/check_callable.py +++ b/stdlib/@tests/test_cases/builtins/check_callable.py @@ -4,5 +4,5 @@ def check_gradual_guarantee(arg: Any) -> int: # if Any materialized to `Callable[[], int] | None`, this function type checks if callable(arg): - return arg() # type: ignore[no-any-return] + return arg() # type: ignore[no-any-return] # pyright: ignore[reportUnnecessaryTypeIgnoreComment] return -1 From 1f0b9bb62c51995780e5b1988117f5fd392e3c7f Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Mon, 20 Jul 2026 20:13:54 +0200 Subject: [PATCH 5/5] check_callable: disable no-any-return error code for mypy --- stdlib/@tests/test_cases/builtins/check_callable.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/stdlib/@tests/test_cases/builtins/check_callable.py b/stdlib/@tests/test_cases/builtins/check_callable.py index 56c065b451e9..ba039a24d8bf 100644 --- a/stdlib/@tests/test_cases/builtins/check_callable.py +++ b/stdlib/@tests/test_cases/builtins/check_callable.py @@ -1,8 +1,10 @@ +# mypy: disable-error-code="no-any-return" + from typing import Any def check_gradual_guarantee(arg: Any) -> int: # if Any materialized to `Callable[[], int] | None`, this function type checks if callable(arg): - return arg() # type: ignore[no-any-return] # pyright: ignore[reportUnnecessaryTypeIgnoreComment] + return arg() return -1