From 6377f4ffbb01eaf595d670abce645b935aa504a0 Mon Sep 17 00:00:00 2001 From: codenamenam Date: Tue, 2 Sep 2025 15:11:58 +0900 Subject: [PATCH 1/6] fix: Allow instantiation of type[None] in analyze_type_type_callee --- mypy/checkexpr.py | 11 +++++++++++ test-data/unit/check-classes.test | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 2e5cf6e544d5..4c400c229c49 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -1926,6 +1926,17 @@ def analyze_type_type_callee(self, item: ProperType, context: Context) -> Type: return self.analyze_type_type_callee(tuple_fallback(item), context) if isinstance(item, TypedDictType): return self.typeddict_callable_from_context(item) + if isinstance(item, NoneType): + # NoneType() returns None, so treat it as a callable that returns None + return CallableType( + arg_types=[], + arg_kinds=[], + arg_names=[], + ret_type=NoneType(), + fallback=self.named_type("builtins.function"), + name=None, + from_type_type=True + ) self.msg.unsupported_type_type(item, context) return AnyType(TypeOfAny.from_error) diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 498a2c12b6e8..9b7e49dc0181 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3866,6 +3866,18 @@ def f(a: Type[Tuple[int, int]]): a() # E: Cannot instantiate type "type[tuple[int, int]]" [builtins fixtures/tuple.pyi] +[case testTypeUsingTypeCNoneType] +NoneType = type(None) +type(None)() +NoneType() +def f(n: type[None]): + n() +def g(n: type[NoneType]): + n() +f(NoneType) +g(NoneType) +[out] + [case testTypeUsingTypeCNamedTuple] from typing import Type, NamedTuple N = NamedTuple('N', [('x', int), ('y', int)]) From f9330a747c656a40b4a812aa4f95f4ac4d518ee0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 2 Sep 2025 06:15:20 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mypy/checkexpr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 4c400c229c49..bbfc40b2a3ec 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -1935,7 +1935,7 @@ def analyze_type_type_callee(self, item: ProperType, context: Context) -> Type: ret_type=NoneType(), fallback=self.named_type("builtins.function"), name=None, - from_type_type=True + from_type_type=True, ) self.msg.unsupported_type_type(item, context) From 8ee1ec898efb72cbd9e92c0e1f26043ed546c30d Mon Sep 17 00:00:00 2001 From: codenamenam Date: Tue, 9 Sep 2025 11:19:03 +0900 Subject: [PATCH 3/6] test: Add type assertion for NoneType() return value --- test-data/unit/check-classes.test | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 9b7e49dc0181..0f53bf275b58 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3867,13 +3867,16 @@ def f(a: Type[Tuple[int, int]]): [builtins fixtures/tuple.pyi] [case testTypeUsingTypeCNoneType] +from typing_extensions import assert_type NoneType = type(None) -type(None)() -NoneType() +assert_type(type(None)(), None) +assert_type(NoneType(), None) + def f(n: type[None]): - n() -def g(n: type[NoneType]): - n() + assert_type(n(), None) +def g(n: type[NoneType]): # type: ignore[valid-type] + assert_type(n(), None) + f(NoneType) g(NoneType) [out] From d8901deba7b8426c3c712c235c6d38af2e4ea5a2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 02:20:36 +0000 Subject: [PATCH 4/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test-data/unit/check-classes.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 0f53bf275b58..8228d0a349e5 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3876,7 +3876,7 @@ def f(n: type[None]): assert_type(n(), None) def g(n: type[NoneType]): # type: ignore[valid-type] assert_type(n(), None) - + f(NoneType) g(NoneType) [out] From 3dcecdf646b55c1e464d39ffa30f42801a6c1489 Mon Sep 17 00:00:00 2001 From: codenamenam Date: Tue, 9 Sep 2025 11:34:34 +0900 Subject: [PATCH 5/6] test: Add builtins fixtures/tuple.pyi --- test-data/unit/check-classes.test | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 8228d0a349e5..2c1688d2067f 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3868,6 +3868,9 @@ def f(a: Type[Tuple[int, int]]): [case testTypeUsingTypeCNoneType] from typing_extensions import assert_type + +[builtins fixtures/tuple.pyi] + NoneType = type(None) assert_type(type(None)(), None) assert_type(NoneType(), None) @@ -3876,7 +3879,7 @@ def f(n: type[None]): assert_type(n(), None) def g(n: type[NoneType]): # type: ignore[valid-type] assert_type(n(), None) - + f(NoneType) g(NoneType) [out] From ff0be30b551c8e3da987584b039f37cbb27f51a0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 02:36:06 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- test-data/unit/check-classes.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 2c1688d2067f..cae6bfb16ea2 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -3879,7 +3879,7 @@ def f(n: type[None]): assert_type(n(), None) def g(n: type[NoneType]): # type: ignore[valid-type] assert_type(n(), None) - + f(NoneType) g(NoneType) [out]